Страницы

Поиск по вопросам

среда, 31 октября 2018 г.

Метод в Python, выводящий все экземпляры своего класса

Как создать метод в Python, который будет выводить все экземпляры того же класса, в котором определен этот метод?


Ответ

Вот вариант в котором не течет память, и который поддерживает оборачивание нескольких классов.
Метакласс:
import weakref
class MyMeta(type): def __init__(self, *args, **kwargs): self.__instances = {} super(MyMeta, self).__init__(*args, **kwargs)
def get_instances(self): return list(self.__instances.values())
def delete(self, id_instance): del self.__instances[id_instance]
def __call__(self, *args, **kwargs): instance = super(MyMeta, self).__call__(*args, **kwargs) self.__instances[id(instance)] = weakref.proxy(instance) return instance
Использование (можно создать несколько таких классов, не копируя метакласс):
class MyClass(object, metaclass=MyMeta): def __del__(self): # этот метод и действие внутри него обязательно, иначе будет течь память под прокси self.__class__.delete(id(self))
print(MyClass.get_instances()) a = MyClass() b = MyClass() print(MyClass.get_instances()) del b print(MyClass.get_instances())

Комментариев нет:

Отправить комментарий