У меня есть несколько странный вопрос о метаклассе. Я использую метакласс для динамического создания класса «sibling», который наследуется от другого суперкласса и назначает его как атрибут исходного класса. Ниже приводится минимальная установка:проблема наследования метакласса python
class Meta(type):
def __new__(cls, name, parents, dct):
sdct = dct.copy()
dct['sibling'] = type(name+'Sibling', (Mom,), sdct)
return super().__new__(cls, name, (Dad,), dct)
class Mom:
def __init__(self):
self.x = 3
class Dad:
def __init__(self):
self.x = 4
class Child(metaclass=Meta):
def __init__(self):
super().__init__()
self.y = 1 # <<< added from feedback
print(Child().x) # 4
print(Child().sibling) # <class '__main__.Child'> | should be ChildSibling
print(Child().sibling().x) # should be 3 instead throws:
# TypeError: super(type, obj): obj must be an instance or subtype of type
print(Child().sibling().y) # should print 4
Что-то, кажется, идет не так выше с созданием класса «родного брата», но я не совсем уверен, что. Я знаю, например, что это сработает:
class ChildAbstract:
def __init__(self):
super().__init__()
ChildSibling = type('ChildSibling', (ChildAbstract, Mom), {})
Child = type('Child', (ChildAbstract, Dad), {'sibling': ChildSibling})
print(Child().sibling().x) # 3
Я не вижу разницы между этими двумя случаями.
Интересный момент, удаление __init__ из словаря работает, но только потому, что в моем примере игрушек я не ничего не делайте в Child .__ init__, так что это не совсем решает проблему (обновленный код для иллюстрации). Я посмотрю на __qualname__ хотя – Buck
Ahh примечание о супер объясняет это – Buck
@Buck Причина, по которой ваш второй пример работает, состоит в том, что основы этих двух динамических типов включают 'ChildAbstract', и поэтому' super() 'счастлив. –