class MyBaseClass:
def __init__(self, value):
self.value = value
class MyChildClass(MyBaseClass):
def __init__(self):
MyBaseClass.__init__(self, 5)- μμ ν΄λμ€ μμ±μμμ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό μ§μ νΈμΆν¨
- ν΄λΉ μ½λλ κ²°ν¨μ΄ μ‘΄μ¬
- λ€μ€ μμμ μν΄ μν₯μ λ°λ κ²½μ° μμ ν΄λμ€μ μμ±μλ₯Ό μ§μ νΈμΆνλ©΄ μμΈ‘ν μ μλ λ°©μμΌλ‘ μλ κ°λ₯ν¨
- λ€μ΄μλͺ¬λ μμ
- λ€μ€ μμμ μν΄ μν₯μ λ°λ κ²½μ° μμ ν΄λμ€μ μμ±μλ₯Ό μ§μ νΈμΆνλ©΄ μμΈ‘ν μ μλ λ°©μμΌλ‘ μλ κ°λ₯ν¨
class TimesTwo:
def __init__(self):
self.value *= 2
class PlusFive:
def __init__(self):
self.value += 5
class OneWay(MyBaseClass, TimesTwo, PlusFive):
def __init__(self, value):
MyBaseClass.__init__(self, value)
TimesTwo.__init__(self)
PlusFive.__init__(self)
class AnotherWay(MyBaseClass, PlusFive, TimesTwo):
def __init__(self, value):
MyBaseClass.__init__(self, value)
TimesTwo.__init__(self)
PlusFive.__init__(self)
foo = OneWay(5)
print('첫 λ²μ§Έ λΆλͺ¨ ν΄λμ€ μμμ λ°λ₯Έ κ°μ (5 * 2) + 5 =', foo.value)
bar = AnotherWay(5)
print('λ λ²μ§Έ λΆλͺ¨ ν΄λμ€ μμμ λ°λ₯Έ κ°μ', bar.value)
>>>
첫 λ²μ§Έ λΆλͺ¨ ν΄λμ€ μμμ λ°λ₯Έ κ°μ (5 * 2) + 5 = 15
λ λ²μ§Έ λΆλͺ¨ ν΄λμ€ μμμ λ°λ₯Έ κ°μ 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
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- λ€μ΄μλͺ¬λ μμμ κ²½μ°
TimeSevenμμ±μλΆν° μ€ν βPlusNineμμλ‘ μ€νλμ΄ (5 * 7) + 9 μμλ‘ κ³μ°λ κΊΌλΌ μμ- κ·Έλ¬λ μ€μ λ‘λ
PlusNineμμ±μ μ€ν μvalueκ° 5λ‘ μ΄κΈ°νλ¨ - κ·Έλμ 14κ° λμ΄
superλ΄μ₯ ν¨μ ν΅ν΄ λΆλͺ¨ ν΄λμ€ μμ±μ νΈμΆ- νμ€ λ©μλ κ²°μ μμ(Method Resolution OMRO) μ μ©λ¨
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 μ μλ₯Ό λ°λ¦
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'>-
ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό λ°λΌ root ν΄λμ€μ μμ±μλ₯Ό μ°Ύμλ€μ΄κ°
-
κ·ΈλΌ κ²°κ΅ μμ±μ νΈμΆμ μμμΌλ‘ μμ μν
MyBaseClassβPlusNineCorrectβTImesSevenCorrectβGoodWay
-
superν¨μμ λκΈΈ μ μλ 2κ°μ§ νλΌλ―Έν°- 1λ²μ§Έ νλΌλ―Έν° : MRO λ·°λ₯Ό μ 곡ν λΆλͺ¨ νμ
- 2λ²μ§Έ νλΌλ―Έν° : 1 λ²μ§Έ νλΌλ―Έν°λ‘ μ§μ ν νμ μ MRO λ·°μ μ κ·Όν λ μ¬μ©ν μΈμ€ν΄μ€
-
object μΈμ€ν΄μ€λ₯Ό μ΄κΈ°νν λ 2κ° νλΌλ―Έν° μ§μ ν νμ μμ
-
νλΌλ―Έν° μμ΄ super λ₯Ό νΈμΆν΄λ νμ΄μ μΈν°ν리ν°κ° μμμ μ±μμ€
class ExplicitTrisect(MyBaseClass):
def __init__(self, value):
super(ExplicitTrisect, self).__init__(value)
self.value /= 3class 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