class MyBaseClass:
def __init__(self, value):
self.value = value
class MyChildClass(MyBaseClass):
def __init__(self):
MyBaseClass.__init__(self, 5)
어떤 클래스가 다중 상속에 의해 영향을 받은 경우, 상위 클래스의 init 메서드를 직접 호출하면 프로그램이 예측할 수 없는 방식으로 작동할 수 있다.
class TimesTwo:
def __init__(self):
self.value *= 2
class PlusFive:
def __init__(self):
self.value += 5
다음 클래스의 정의는 부모 클래스를 TimesTwo,PlusFive 순서로 정의한다.
class OneWay(MyBaseClass, TimesTwo, PlusFive):
def __init__(self, value):
MyBaseClass.__init__(self, value)
TimesTwo.__init__(self)
PlusFive.__init__(self)
foo = OneWay(5)
print('첫 번째 부모 클래스 순서에 따른 값은 (5 * 2) + 5 =', foo.value)
첫 번째 부모 클래스 순서에 따른 값은 (5 * 2) + 5 = 15
class AnotherWay(MyBaseClass, PlusFive, TimesTwo): #순서가 바뀜
def __init__(self, value):
MyBaseClass.__init__(self, value)
TimesTwo.__init__(self)
PlusFive.__init__(self)
#class 안에서는 정의 순서대로 작동.
bar = AnotherWay(5)
print('두 번째 부모 클래스 순서에 따른 값은', bar.value)
두 번째 부모 클래스 순서에 따른 값은 15
class TimesSeven(MyBaseClass):
def __init__(self, value):
MyBaseClass.__init__(self, value)
self.value *= 7
class PlusNine(MyBaseClass):
def __init__(self, value):
MyBaseClass.__init__(self, value)
self.value += 9
다음으로 이 두 클래스 모두 상속하는 자식 클래스를 정의해 MyBaseClass를 다이아몬드의 맨 위 꼭지점에 위치시킨다.
class ThisWay(TimesSeven, PlusNine):
def __init__(self, value):
TimesSeven.__init__(self, value)
PlusNine.__init__(self, value)
foo = ThisWay(5)
print('(5 * 7) + 9 = 44가 나와야 하지만 실제로는', foo.value)
(5 * 7) + 9 = 44가 나와야 하지만 실제로는 14
class TimesSevenCorrect(MyBaseClass):
def __init__(self, value):
super().__init__(value)
self.value *= 7
class PlusNineCorrect(MyBaseClass):
def __init__(self, value):
super().__init__(value)
self.value += 9
class GoodWay(TimesSevenCorrect, PlusNineCorrect):
def __init__(self, value):
super().__init__(value)
foo = GoodWay(5)
print('7 * (5 + 9) = 98이 나와야 하고 실제로도', foo.value)
7 * (5 + 9) = 98이 나와야 하고 실제로도 98
mro_str = '\n'.join(repr(cls) for cls in GoodWay.mro())
print(mro_str)
<class 'main.GoodWay'>
<class 'main.TimesSevenCorrect'>
<class 'main.PlusNineCorrect'>
<class 'main.MyBaseClass'>
<class 'object'>
class ExplicitTrisect(MyBaseClass):
def __init__(self, value):
super(ExplicitTrisect, self).__init__(value)
self.value /= 3
class AutomaticTrisect(MyBaseClass):
def __init__(self, value):
super(__class__, self).__init__(value)
self.value /= 3
class ImplicitTrisect(MyBaseClass):
def __init__(self, value):
super().__init__(value)
self.value /= 3
assert ExplicitTrisect(9).value == 3
assert AutomaticTrisect(9).value == 3
assert ImplicitTrisect(9).value == 3