如何在Python类定义内部创建指向自身实例的类变量?
如何在Python类定义内部创建指向自身实例的类变量?
嗨,我来帮你搞定这个问题!你现在的困扰是,把NORESULT这个类实例定义在类外面的话,PyCharm会报错说类没有这个属性,但想移到类内部又不知道怎么写对吧?
首先得说清楚为什么你之前的两种尝试都不行:
- 第一种写法里,
cls这个名字只有在被@classmethod装饰的方法里才会作为参数存在,在类体的直接作用域里根本找不到它,所以会报“Unresolved reference cls”。 - 第二种写法把
NORESULT放到了__init__里,这就变成了实例属性——意思是你得先创建一个Result实例才能访问它,而且每个实例都会有自己的NORESULT,完全不符合你想要的“类级别的常量”的需求。
那怎么实现和原来完全一样的功能,还能让PyCharm识别到这个类属性呢?给你两个简单的方案:
方案一:先声明类属性,再在类定义完成后赋值
这是最贴合你原有代码的方法,只需要加一行声明,PyCharm就不会再报错了:
class Result(object): # 先在这里声明NORESULT属性,让IDE能识别到它 NORESULT = None def __init__(self, slope, offset): self._slope = slope self._offset = offset @classmethod def dothemath(cls, etc): ... # 等类完全定义好之后,再给NORESULT赋值 Result.NORESULT = Result((0, 0), (0, 0))
这样做的好处是,所有原来的代码(比如if object.result is not Result.NORESULT)都不用改,功能和之前完全一致,而且PyCharm能识别到NORESULT是Result类的属性,不会再弹警告。
方案二:用类方法延迟初始化(可选)
如果你想把逻辑完全封装在类内部,可以用一个类方法来懒加载这个实例,不过需要修改调用的地方:
class Result(object): # 用一个私有变量存实例,避免重复创建 _noresult_instance = None def __init__(self, slope, offset): self._slope = slope self._offset = offset @classmethod def dothemath(cls, etc): ... @classmethod def get_noresult(cls): if cls._noresult_instance is None: cls._noresult_instance = cls((0, 0), (0, 0)) return cls._noresult_instance
之后使用的时候,把Result.NORESULT改成Result.get_noresult()就行。这种方式的好处是实例只会在第一次调用时创建,不过对你的场景来说,方案一已经足够好用啦。
另外补充一句,你提到在其他地方见过cls()的用法,那肯定是在类方法内部——因为只有类方法会把当前类作为cls参数传进来,在类体的直接作用域里是用不了cls的哦~
备注:内容来源于stack exchange,提问作者Réka
相关产品推荐
相关产品推荐

