我对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
吗?
答案 0 :(得分:3)
两个类方法中的问题都是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)
但是我认为您实现这些方法的方式有些错误,您不应为此使用类方法。
有人可以解释为什么我无法通过第二种方法访问`吗?
我应该说,您甚至也无法在connect_r
中访问r。 r
是另一个具有不同作用域的变量,如果您想查看将发生什么,只需将r
中的cls.r
更改为get_clients
,您将看到此方法将返回None
,似乎connect_r
方法未设置实际的r
,要在类方法中访问这些变量,应使用cls
。
还可以看到cls
和self
here之间的区别。