Я видел несколько вопросов по этой теме, но я не смог найти окончательного ответа.Как вы смешиваете классы Python в стиле старого стиля и нового стиля?
Я хотел бы знать, как правильно использовать классы старого стиля в новой базе кода Python. Скажем, например, что у меня есть два фиксированных класса, A и B. Если я хочу создать подкласс и B и конвертировать в новых классов (A2 и B2), это работает. Однако есть проблема, если я хочу создать новый класс C, от A2 и B2.
Таким образом, можно ли продолжить этот метод или все классы должны соответствовать старому стилю, если какой-либо базовый класс определен как старомодный?
Смотрите пример кода для осветления:
class A:
def __init__(self):
print 'class A'
class B:
def __init__(self):
print 'class B'
class A2(A,object):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B,object):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C,self).__init__()
print 'class C'
A2()
print '---'
B2()
print '---'
C()
Выход этого кода:
class A
class A2
---
class B
class B2
---
class A
class A2
class C
Как вы можете видеть, проблема заключается в том, что в вызове C()
, класс B2 никогда не инициализировался.
Update - New-Style Класс Пример
Я предполагаю, что это не ясно, что правильная последовательность инициализации должна быть при использовании super
. Вот рабочий пример, когда вызов супер делает инициализировать все базовые классы, а не только первый найденный.
class A(object):
def __init__(self):
super(A, self).__init__()
print 'class A'
class B(object):
def __init__(self):
super(B, self).__init__()
print 'class B'
class A2(A):
def __init__(self):
super(A2, self).__init__()
print 'class A2'
class B2(B):
def __init__(self):
super(B2, self).__init__()
print 'class B2'
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print 'class C'
C()
и производит вывод:
class B
class B2
class A
class A2
class C
Обновленный ответ, включающий объяснение наследования алмазов и проблему, решаемую с помощью классов нового стиля. –
Почему у вас вообще есть классы старого стиля? –
Возможно, сторонние модули? –