--------------------------------编辑-------------- --------------------------
这是完整的代码,对不起,我忘了添加@classmethod装饰器
from abc import ABC, abstractmethod
class Player(ABC):
player_list = []
@classmethod
def __init__(self, name):
self.name = name
self.score = 0
Player.player_list.append(self)
@abstractmethod
def getname(self):
pass
class generic(Player):
def getname(self):
return self.name
p1 = generic('bob')
p2 = generic('tim')
p1.name = 'steve'
for player in Player.player_list:
print(player.name)
蒂姆,这不回史蒂夫
而是返回tim,tim
也
print(Player.player_list)
返回
[<class '__main__.generic'>, <class '__main__.generic'>]
答案 0 :(得分:0)
您应该使用名为player_list
的迭代器对象,以便通过类对象检索新插入的数据。您不会从空名单中得到任何东西。您的操作不正确。
请参见下文
p1 = Player('bob')
print(p1)
for p in p1.player_list:
print(p.name)
print(p1.player_list[0].name)
输出:-
<__main__.Player object at 0x10851c2b0>
bob
bob
答案 1 :(得分:0)
只想给您一些解释,如果您感兴趣的话,如果在classmethod
上使用__init__
会导致奇怪的行为。
class Player:
player_list = []
@classmethod
def __init__(self, name):
self.name = name
self.score = 0
Player.player_list.append(self)
p1 = Player('bob')
print("1: " + p1.name)
p2 = Player('tim')
print("2: " + p1.name)
print("3: " + p2.name)
p1.name = 'steve'
print("4: " + p1.name)
for player in Player.player_list:
print("5: " + player.name)
输出将是:
1: bob
2: tim
3: tim
4: steve
5: tim
5: tim
对于上述代码,当您执行此操作时,self
中的__init__
将不再意味着一个类的对象,您可以print(self)
看到它是<class '__main__.Player'>
,不是<__main__.Player object at 0x7f3264820fd0>
,这意味着自我是阶级,而不是客体。实际上,如果我们使用classmethod
,通常我们会将self
更改为cls
。
因此self.name = name
不是您期望的对象属性设置值bob
或tim
,而是实际上设置为Player.name
,这是一个类属性。一类只有一个具有相同名称的类属性,因此您可以看到p2 = Player('tim')
完成时,p1
和p2
都具有名称tim
。
p1.name = 'steve'
发生了什么,这里p1
是一个对象,这将向object attribute
添加一个名称为name
的{{1}},所以现在{ {1}}不再表示p1 object
,而是表示p1的对象属性。因此p1.name
会给您Player.name
。
最后,下面发生了什么,为什么还print("4: " + p1.name)
?
steve
这是因为tim
已将for player in Player.player_list:
print("5: " + player.name)
添加到Player.player_list.append(self)
,<class '__main__.Player'>
不是类,所以仍显示Player.player_list
。