如何在不丢失引用的情况下创建对象列表

2024-04-25 13:14:35 发布

您现在位置:Python中文网/ 问答频道 /正文

-----------------------------------编辑-----------------------------------------

这是全部代码,抱歉我忘了添加@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'>]

Tags: nameselfmaindefgenericlistclassplayer
2条回答

只是想给你一些解释,如果你感兴趣的话,在__init__上使用classmethod,为什么会有奇怪的行为。你知道吗

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

对于上面的代码,当您这样做时,__init__中的self将不再意味着一个类的对象,您可以print(self)看到它是<class '__main__.Player'>,而不是<__main__.Player object at 0x7f3264820fd0>,这意味着自我是类,而不是对象。事实上,如果我们使用classmethod,通常我们会将self改为cls。你知道吗

所以self.name = name并不像您期望的那样将值bobtim设置为object属性,它实际上只是设置为Player.name,这是一个class属性。一个类只有一个具有相同名称的类属性,因此您可以看到当p2 = Player('tim')完成时,两个p1&;p2都具有名称tim。你知道吗

对于p1.name = 'steve',这里,p1是一个对象,这将添加一个名为nameobject attributep1 object,所以现在p1.name不再意味着Player.name,它实际上意味着p1的对象属性。所以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_listplayer是类而不是对象,所以仍然显示tim。你知道吗

应该使用名为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

相关问题 更多 >