如何在不丢失参考的情况下列出对象

时间:2018-07-20 06:08:37

标签: python function class

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

这是完整的代码,对不起,我忘了添加@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'>]

2 个答案:

答案 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不是您期望的对象属性设置值bobtim,而是实际上设置为Player.name,这是一个类属性。一类只有一个具有相同名称的类属性,因此您可以看到p2 = Player('tim')完成时,p1p2都具有名称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