2

代码的期望输出是我有一个类变量 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

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

4

3 回答 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>]
于 2013-10-10T16:38:27.883 回答
1

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

如果你想stuff成为一个函数的一个属性,你必须像这样定义它:self.stuff=[].

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

于 2013-10-10T16:33:24.943 回答
1

原因是cls在你的__init__函数中没有定义。参数名称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
于 2013-10-10T16:36:43.847 回答