我是python的新手。我正在做以下代码,我遇到了一个不受欢迎的结果。请查看我的代码,让我知道我做错了什么:
class TestClass(object):
@classmethod
def __init__(self, val):
self.val = val
@classmethod
def value(self):
return self.val
def Test():
a = TestClass(9)
b = TestClass(8)
c = TestClass(7)
print(a.value(), b.value(), c.value())
期望输出为
9 8 7
但输出为
7 7 7
我的代码出了什么问题。
答案 0 :(得分:7)
将__init__
设置为classmethod
表示您实际将课程传递给__init__
并且self.val
实际设置为类变量, not 一个实例变量。
最终"初始化"你执行将覆盖你设置的所有其他值。
删除@classmethod
可修复此问题。
答案 1 :(得分:2)
您已将@classmethod
附加到__init__
功能。因此,如果您调用__init__
(您在构造时执行的操作),self
将不会引用您要构建的对象,但将class
,TestClass
。因此,只有一个value
:附加到TestClass
。
所以TestClass(3)
等同于TestClass.__init__(TestClass,3)
...
您可以通过删除@classmethod
装饰器来解决问题:
class TestClass(object):
def __init__(self, val): # no @classmethod
self.val = val
def value(self): # no @classmethod
return self.val
def Test():
a = TestClass(9)
b = TestClass(8)
c = TestClass(7)
print(a.value(), b.value(), c.value())
在@classmethod
方法上使用__init__
实际上相当奇怪。如果要向类添加属性,可以使用type(..)
。所以:
@classmethod
def __init__(cls, val):
cls.val = val
相当于:
def __init__(self, val):
type(self).val = val