@pythonMyLife

Не понимаю наследование __new__, в чём ошибка?

Изучаю метаклассы, пока решил написать простой метакласс, обьект которого - тоже метакласс. Вот код, но я не до конца понимаю его поведение:

class meta (type):
    def __new__ (cls, fcls_name, fcls_parents, fcls_dict, *args, **kwargs):
        fcls_parents = (cls, ) + fcls_parents
        
        print (f'Class {fcls_name !r} from {cls}:')
        print (f'* {args = }')
        print (f'* {kwargs = }')
        print (f'* {fcls_parents = }')
        print ()

        fcls = super ().__new__ (cls, fcls_name, fcls_parents, fcls_dict)

        print (f'End of class {fcls_name}, class object: {fcls !r}')
        print ('\n')

        return fcls


class A (metaclass = meta): pass

class B (metaclass = A): pass

Вывод:
Class 'A' from <class '__main__.meta'>:
* args = ()
* kwargs = {}
* fcls_parents = (<class '__main__.meta'>,)

End of class A, class object: <class '__main__.A'>


Class 'B' from <class '__main__.A'>:
* args = ()
* kwargs = {}
* fcls_parents = (<class '__main__.A'>,)

End of class B, class object: <class '__main__.B'>


По идее при создании класса 'B' вызывается __new__ метакласса 'A', которое получено от родителя при создании класса 'A' метаклассом meta, и в этом __new__ дилегируется вызов к родителю через super, то есть в meta и таким образом по моей логике вывод должен быть такой:

Class 'A' from <class '__main__.meta'>:
* args = ()
* kwargs = {}
* fcls_parents = (<class '__main__.meta'>,)

End of class A, class object: <class '__main__.A'>


Class 'B' from <class '__main__.A'>:
* args = ()
* kwargs = {}
* fcls_parents = (<class '__main__.A'>,)

Class 'B' from <class '__main__.meta'>:
* args = ()
* kwargs = {}
* fcls_parents = (<class '__main__.meta'>, <class '__main__.A'>,)

End of class B, class object: <class '__main__.B'>
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Метакласс и родитель - разные вещи. A не наследует meta и его метод __new__ не вызывает meta
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы