Python类继承,__ init__和cls

时间:2013-10-10 16:30:55

标签: python inheritance initialization class-method class-variables

代码的期望输出是我有一个类变量Team.stuff,其中有一个条目保存b实例,而Player.stuff变量应该为空。相反,我得到一个错误......

class Player:
  stuff=[]
  def __init__(self):
    cls.stuff.append(self)

class Team(Player):
  def __init__(self):
    super(Team, self).__init__()

b=Team()

ERROR

cls.stuff.append(self)
NameError: global name 'cls' is not defined

我可以传递Team.__init__()中的cls变量,但我不确定这是否是“正确”方式,更重要的是Player.__init__()需要一个类变量,而且我'我不确定如何做到这一点的语法。

3 个答案:

答案 0 :(得分:1)

class Player(object):
    stuff=[]
    def __init__(self):
        self.stuff.append(self)

class Team(Player):
    def __init__(self):
        super(Team, self).__init__()

b = Team()
print(Team.stuff)

打印(类似的东西)

[<__main__.Team object at 0xb7519dec>]

答案 1 :(得分:0)

请记住,cls不是Python中的关键字。相反,它是方法的第一个参数的约定,当该方法应该是一个类函数而不是在某个特定实例上调用的那个。

如果您希望stuff成为函数的属性,则必须按以下方式定义:self.stuff=[]

然后,当您在方法中引用它时,也可以使用self关键字:self.stuff.append(..)

答案 2 :(得分:0)

原因是您的cls函数中的__init__未定义。参数名称selfcls只是命名约定。实际上,您可以分别为实例和类方法命名foobarfoo指向类实例,而bar指向类本身。

此外,self.stuff在搜索属性时有效,如果某个对象的__dict__字典中没有此类名称的属性,则其__dict__类是相反。如果两者都缺失,则根据mro顺序进行进一步查找。

请注意,一旦在对象实例上设置属性stuff,它将 shadow 类定义。

通过例子说明:

class MyClassA(object):
    stuff = []

class MyClassB(MyClassA):
     def __init__(foobar):
         # `foobar` points at the instance of `MyClassB` class.

         # MyClassA.stuff gets `1` object appended to it.
         foobar.stuff.append(1)

         # This should print '[1]'
         print foobar.stuff

         # `MyClassB` object gets a _new_ attribute named `stuff` pointing at a list.
         foobar.stuff = []

         # This should print '[]'.
         print foobar.stuff