无法为@classmethod 中的变量赋值
can't assign a value to a variable in a @classmethod
我在 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: name 'r' is not defined
以下是我使用 class、
的方式
clients = GetClients()
clients.connect_r("localhost", 6379, 0)
allc = clients.get_clients("clients")
谁能解释一下为什么我无法在第二种方法中访问 r
?
问题是 r
在两个 class 方法中,您应该将 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)
但是我认为你实现这些方法的方式有点不对,你不应该使用class这种需求的方法。
can someone please explain why I cannot access` in the 2nd method?
我应该说你甚至不能在 connect_r
中访问 r。 r
是另一个具有不同作用域的变量,如果您想看看会发生什么,只需将 get_clients
中的 r
更改为 cls.r
,您将看到此方法将 returns None
并且 connect_r
方法似乎没有设置实际的 r
,要访问 class 方法中的那些变量,您应该使用 cls
。
还可以看到 cls
和 self
.
之间的区别
我在 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: name 'r' is not defined
以下是我使用 class、
的方式clients = GetClients()
clients.connect_r("localhost", 6379, 0)
allc = clients.get_clients("clients")
谁能解释一下为什么我无法在第二种方法中访问 r
?
问题是 r
在两个 class 方法中,您应该将 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)
但是我认为你实现这些方法的方式有点不对,你不应该使用class这种需求的方法。
can someone please explain why I cannot access` in the 2nd method?
我应该说你甚至不能在 connect_r
中访问 r。 r
是另一个具有不同作用域的变量,如果您想看看会发生什么,只需将 get_clients
中的 r
更改为 cls.r
,您将看到此方法将 returns None
并且 connect_r
方法似乎没有设置实际的 r
,要访问 class 方法中的那些变量,您应该使用 cls
。
还可以看到 cls
和 self