Python类继承,__init__和cls

3
代码的期望输出是,我有一个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()

错误

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

我可以在Team.__init__()中传递cls变量,但我不确定这是否是“正确”的方法,更重要的是Player.__init__()需要一个类变量,而我不确定如何使用语法来实现。
3个回答

2
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>]

谢谢,但那不是我需要的。我需要打印(Team.stuff),而不是打印(b.stuff)。 - appleLover

1
这是因为在你的__init__函数中,cls没有被定义。参数名selfcls只是命名约定。实际上,你可以将它们分别命名为foobar,代表实例和类方法,foo将指向类实例,而bar将指向类本身。
此外,self.stuff是有效的,因为在查找属性时,如果对象的__dict__字典中没有该名称的属性,则会查找其类的__dict__。如果两者都不存在,则根据mro顺序进行进一步查找。
请注意,一旦在对象实例上设置了属性stuff,它将遮蔽类定义。
通过示例解释:
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

1
请记住,cls不是Python中的关键字。相反,当该方法应该是类函数而不是在特定实例上调用的函数时,它是第一个参数的约定。
如果你想让stuff成为函数的属性,你必须这样定义:self.stuff=[]
然后,在方法中引用它时,也要使用self关键字:self.stuff.append(..)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接