如何获取一个类的所有实例

3

我作为一个初学者正在学习Python,并想创建一个名为Person的类。在构造函数中,我想将每个实例放入一个名为“instances”的集合中。然后,我希望instances()方法返回所有实例。我该如何做到这一点?

class Person:

    # Type annotations
    __first_name: str
    __last_name: str
    instances: set

    # Initializing variables
    no_of_persons = 0
    instances = set()

    def __init__(self, firstname="unknown", lastname="unknown"):
        self.__first_name = firstname
        self.__last_name = lastname
        Person.no_of_persons += 1
        Person.instances.add() ## Here I have problems

    @property
    def first_name(self):
        return self.__first_name

    @first_name.setter
    def first_name(self, firstname):
        self.__first_name = firstname

    @property
    def last_name(self, ):
        return self.__last_name 

    @last_name.setter
    def last_name(self, lastname):
        self.__last_name = lastname

    def getFullName(self):
        """ Returns a tuple of the firstname and the lastname """
        return (self.__first_name, self.__last_name)

    def summary(self):
        """ Returns a dictionary of all instance variables """
        return {'first_name': self.__first_name,
                'last_name': self.__last_name}
    @staticmethod
    def number_of_persons():
        return Person.no_of_persons

    @staticmethod
    def instances():
        return Person.instances

p1 = Person()
Person.number_of_persons()
Person.instances()

你难道不能只使用type(<instance>).__subclasses__()吗?或者如果你直接引用它的话,只需使用<class>.__subclasses__()就可以了。 - miike3459
2
另外,请修正您的缩进;目前的格式不符合有效的语法。 - miike3459
通常情况下,让类来追踪这个是一个错误;与其让类保持其所有实例的列表,往往更好的做法是在明确的容器上下文中追踪对象。 - user2357112
1
我为这个问题点了一个+1,但请考虑修改代码。它过于复杂了。请简单地删除所有不必要的部分。祝你未来的问题好运! - Marine Galantin
1个回答

9
你需要将self添加到集合中。
Person.instances.add(self)

或更加口语化
self.__class__.instances.add(self)

此外,您需要为获取实例的方法使用不同的名称;并且它应该是一个classmethod,而不是一个staticmethod。
@classmethod
def get_instances(cls):
    return cls.instances

实际上,在这里您完全不需要方法,因为您可以直接访问 Person.instances (属性)。


1
注意:由于instances没有被赋值,所以你不需要使用self.__class__.instances.add(self);只要实例没有通过实例级别的instances屏蔽它,self.instances.add(self)将在类上查找instances - ShadowRanger
由于我们只是在self.instances中添加内容,所以这段代码没有线程安全问题,对吗? - raratiru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接