Как получить все экземпляры класса - PullRequest
0 голосов
/ 02 января 2019

Я изучаю Python для начинающих, и я хотел бы создать класс Person. В конструкторе я хотел бы поместить каждый созданный экземпляр в набор под названием «экземпляры». Тогда я бы хотел, чтобы метод 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()

1 Ответ

0 голосов
/ 02 января 2019

Вам необходимо добавить self к набору.

Person.instances.add(self)

или более идиоматически

self.__class__.instances.add(self)

Также вам нужно использовать другое имя для метода, который получает экземпляры; и это должен быть метод класса, а не статический метод.

@classmethod
def get_instances(cls):
    return cls.instances

Хотя на самом деле вам здесь вообще не нужен метод, так как вы можете получить прямой доступ к Person.instances (атрибуту).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...