代码的期望输出是我有一个类变量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__()
需要一个类变量,而且我'我不确定如何做到这一点的语法。
答案 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__
未定义。参数名称self
和cls
只是命名约定。实际上,您可以分别为实例和类方法命名foo
和bar
,foo
指向类实例,而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