-----------------------------------编辑-----------------------------------------
这是全部代码,抱歉我忘了添加@classmethod decorator
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)
这不是回报,史蒂夫,蒂姆 相反,蒂姆,蒂姆
还有
print(Player.player_list)
退货
[<class '__main__.generic'>, <class '__main__.generic'>]
只是想给你一些解释,如果你感兴趣的话,在
__init__
上使用classmethod
,为什么会有奇怪的行为。你知道吗输出为:
对于上面的代码,当您这样做时,
__init__
中的self
将不再意味着一个类的对象,您可以print(self)
看到它是<class '__main__.Player'>
,而不是<__main__.Player object at 0x7f3264820fd0>
,这意味着自我是类,而不是对象。事实上,如果我们使用classmethod
,通常我们会将self
改为cls
。你知道吗所以
self.name = name
并不像您期望的那样将值bob
或tim
设置为object属性,它实际上只是设置为Player.name
,这是一个class属性。一个类只有一个具有相同名称的类属性,因此您可以看到当p2 = Player('tim')
完成时,两个p1
&;p2
都具有名称tim
。你知道吗对于
p1.name = 'steve'
,这里,p1
是一个对象,这将添加一个名为name
的object attribute
到p1 object
,所以现在p1.name
不再意味着Player.name
,它实际上意味着p1的对象属性。所以print("4: " + p1.name)
会给你steve
。你知道吗最后,下面发生了什么,为什么仍然
tim
?你知道吗这是因为
Player.player_list.append(self)
已经将<class '__main__.Player'>
添加到Player.player_list
,player
是类而不是对象,所以仍然显示tim
。你知道吗应该使用名为
player_list
的迭代器对象,以便通过类对象检索新插入的数据。你不能从空名单中得到任何东西。你的操作不正确。 请看下面你知道吗输出:-你知道吗
相关问题 更多 >
编程相关推荐