无法为@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。 还可以看到 clsself .

之间的区别