ссылка на экземпляр класса из его метакласса python

avatar
KiNest
1 июля 2021 в 20:45
28
1
0

Есть ли способ ссылаться на экземпляр класса из его метакласса каждый раз при создании экземпляра? Я полагаю, что для этой цели мне следует использовать метод dunder _call_ внутри метакласса.

У меня есть следующий код:

class meta(type):   
    def __call__(cls):
       super().__call__()
       #<--- want to get an object of A class here every time when instance of A class is created

class A(metaclass = meta):
    def __init__(self, c):
        self.c = 2

    def test(self):
        print('test called')
   
a1=A()
a2=A()
a3=A()

Кроме того, почему, когда я реализую метод __call__ внутри метакласса, все созданные экземпляры моего класса становятся NoneType, однако при переопределении __call__ я использовал super().__call__()? Например, a4.test() возвращает AttributeError: объект «NoneType» не имеет атрибута «тест»

Источник
juanpa.arrivillaga
2 июля 2021 в 03:53
0

Конечно, потому что ваш метод __call__ возвращает None

Ответы (1)

avatar
jsbueno
2 июля 2021 в 03:02
1

Вновь созданный экземпляр возвращается super().__call__() — вы должны сохранить это значение в переменной, использовать t для чего хотите и вернуть его.

В противном случае, если метакласс __call__ не имеет оператора возврата, все экземпляры немедленно разыменовываются и уничтожаются, а код, пытающийся создать экземпляры, просто получает None:


class meta(type):   
    def __call__(cls):
       obj = super().__call__()
       # use obj as you see fit
       ...
       return obj