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