【问题标题】:can't assign a value to a variable in a @classmethod无法为@classmethod 中的变量赋值
【发布时间】:2018-09-29 05:44:38
【问题描述】:

我有一点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' 未定义

这是我使用课程的方式,

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

谁能解释一下为什么我无法在第二种方法中访问r

【问题讨论】:

    标签: python class class-method


    【解决方案1】:

    问题是两个类方法中的r,你应该用cls.r替换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 是另一个具有不同作用域的变量,如果你想看看会发生什么,只需将 get_clients 中的 r 更改为 cls.r,你会看到此方法将返回 None,而且似乎 @ 987654332@ 方法没有设置实际的r,要在类方法中访问这些变量,您应该使用cls。 另请参阅 clsself here 之间的区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      相关资源
      最近更新 更多