#python #ооп
Как создать метод в Python, который будет выводить все экземпляры того же класса, в котором определен этот метод?
Ответы
Ответ 1
Вот вариант в котором не течет память, и который поддерживает оборачивание нескольких классов. Метакласс: 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())Ответ 2
Взял пример синглтона через мета-класс, немного его изменил и получился такой вот пример. Эта реализация будет собирать экземпляры для всех классов с данным мета-классом class MyMeta(type): instances = list() def __call__(cls, *args, **kwargs): instance = super(MyMeta, cls).__call__(*args, **kwargs) cls.instances.append(instance) return instance # Python2 class MyClass(object): __metaclass__ = MyMeta # Python3 class MyClass(object, metaclass=MyMeta): pass print(MyClass.instances) a = MyClass() print(MyClass.instances) b = MyClass() c = MyClass() print(MyClass.instances) Консоль: [] [<__main__.MyClass object at 0x00514AF0>] [<__main__.MyClass object at 0x00514AF0>, <__main__.MyClass object at 0x00736DF0>, <__main__.MyClass object at 0x00736C30>]Ответ 3
instances = [] def decor(cls): def wrap(*args, **kwargs): obj = cls(*args, **kwargs) instances.append(obj) return obj return wrap @decor class A: pass print(instances) # [] A() print(instances) # [<__main__.A object at 0x02D10C10>] A() print(instances) # [<__main__.A object at 0x02D10C10>, <__main__.A object at 0x02D10F50>]Ответ 4
Возможно вы это имели в виду? class A: count = 0 def __init__(self): A.count += 1 def get_count(self): return self.count a = A() a.count >> 1 a.get_count() >> 1 b = A() a.count >> 2 b.get_count() >> 2
Комментариев нет:
Отправить комментарий