无法为@classmethod

时间:2018-09-29 05:44:39

标签: python class class-method

我对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 :(得分: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。 还可以看到clsself here之间的区别。