Python中的类变量问题

时间:2017-03-10 13:29:38

标签: python python-3.x class

我是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

我的代码出了什么问题。

2 个答案:

答案 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