невозможно присвоить значение переменной в @classmethod - PullRequest
0 голосов
/ 29 сентября 2018

Я немного разбираюсь в Java и часто использую static переменные и методы.Я новичок в Python и узнаю об использовании @classmethod в качестве статического метода.

Вот код,

import redis

class GetClients:
    r = None

    @classmethod
    def connect_r(cls, host, port, db):
        r = redis.StrictRedis(host=host, port=port, db=db)

    @classmethod
    def get_clients(cls, clients_key):
        return r.smembers(clients_key)

Мой код сначала создает переменную r, а затем внутри classmethod он назначает его подключению redis, r = redis.StrictRedis(host=host, port=port, db=db)

В следующем методе get_clients я использую значение r для вызова функции на нем., Но я продолжаю получать следующееошибка

NameError: имя 'r' не определено

вот как я использую класс,

clients = GetClients()
clients.connect_r("localhost", 6379, 0)
allc = clients.get_clients("clients")

может кто-нибудь объяснить, пожалуйстапочему я не могу получить доступ к r во втором методе?

1 Ответ

0 голосов
/ 29 сентября 2018

Проблема в r в обоих методах класса, вы должны заменить r на cls.r.как это:

import redis

class GetClients:
    r = None

    @classmethod
    def connect_r(cls, host, port, db):
        cls.r = redis.StrictRedis(host=host, port=port, db=db)

    @classmethod
    def get_clients(cls, clients_key):
        return cls.r.smembers(clients_key)

Но я думаю, что ваш способ реализации этих методов немного неправильный, вы не должны использовать методы класса для этих требований.

может кто-нибудь пожалуйстаобъясните, почему я не могу получить доступ к `во втором методе?

Я должен сказать, что вы даже не можете получить доступ к r в connect_r.что r - это другая переменная с другой областью действия, и если вы хотите увидеть, что произойдет, просто измените r на cls.r в get_clients, вы увидите, что этот метод вернет None, и кажется, что *Метод 1019 * не устанавливает фактическое значение r, для доступа к этим переменным в методах класса вы должны использовать cls.также посмотрите разницу между cls и self здесь .

...