gpt4 book ai didi

python - 测试 @classmethod 函数的现有属性,产生 AttributeError

转载 作者:行者123 更新时间:2023-11-28 20:29:15 24 4
gpt4 key购买 nike

我有一个函数,它是一个类方法,我想测试类的一个属性,它可能是也可能不是 None,但将始终存在。

class classA():
def __init__(self, var1, var2 = None):
self.attribute1 = var1
self.attribute2 = var2

@classmethod
def func(self,x):
if self.attribute2 is None:
do something

我得到了错误

AttributeError: class classA has no attribute 'attributeB'

当我像我展示的那样访问属性时,但如果在命令行上我可以看到它有效,

x = classA()
x.attribute2 is None
True

所以测试有效。

如果我从 func 中删除 @classmethod 装饰器,问题就会消失。
如果我离开 @classmethod 装饰器,它似乎只会影响在父类(super class)的构造函数中提供默认值的变量。

上面的代码是怎么回事?

最佳答案

类属性和实例属性是有区别的。一个快速演示是这样的:

>>> class A(object):
... x=4
... def __init__(self):
... self.y=2
>>> a=A() #a is now an instance of A
>>> A.x #Works as x is an attribute of the class
2: 4
>>> a.x #Works as instances can access class variables
3: 4
>>> a.y #Works as y is an attribute of the instance
4: 2
>>> A.y #Fails as the class A has no attribute y
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
A.y #Fails as the class A has no attribute y
AttributeError: type object 'A' has no attribute 'y'
>>>

现在,当一个类的方法被classmethod修饰时,这表明它不接受实例,而是接受类本身作为参数。因此,通常我们将第一个参数命名为 cls,而不是 self。在您的代码中,classA 没有属性,因此尝试访问 attribute2 失败。这种差异可以用下面的代码显示:

>>> class B(object):
... x=2
... def __init__(self):
... self.x=7
... def pr1(self):
... print self.x
... @classmethod
... def pr2(cls):
... print cls.x
>>> b=B()
>>> B.x
2
>>> b.x
7
>>> b.pr1()
7
>>> b.pr2()
2
>>> B.pr2()
2

我可能不够清楚,所以如果您仍然感到困惑,只需搜索 classmethod 或 new-style classes 并阅读一些内容。

关于python - 测试 @classmethod 函数的现有属性,产生 AttributeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com