Как создать метод в 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())
Комментариев нет:
Отправить комментарий