[英]Why can't pass *args and **kwargs in __init__ of a child class
[英]Why is super().__init__(*args,**kwargs) being used when class doesn't specify a superclass?
我理解為什么當一個類是超類的子類時使用了super(),但是什么是未指定子類參數中的超類的類的超類? 這是我的代碼:
import random
class Sneaky:
sneaky = True
def __init__(self, sneaky=True, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sneaky = sneaky
def hide(self, light_level):
return self.sneaky and light_level < 10
class Agile:
agile = True
def __init__(self, agile=True, *args, **kwargs):
super().__init__(*args, **kwargs)
self.agile = agile
def evade(self):
return self.agile and random.randint(0, 1)
假設Sneaky
用作多繼承類結構的一部分,例如:
class Sneaky:
sneaky = True
def __init__(self, sneaky=True, *args, **kwargs):
super().__init__(*args, **kwargs)
self.sneaky = sneaky
def hide(self, light_level):
return self.sneaky and light_level < 10
class Person:
def __init__(self, human=True, *args, **kwargs):
super().__init__(*args, **kwargs)
self.human = human
class Thief(Sneaky, Person):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
t = Thief()
print(t.human)
# True
以來
In [62]: Thief.mro()
Out[62]: [__main__.Thief, __main__.Sneaky, __main__.Person, object]
Thief.__init__
的super().__init__(*args, **kwargs)
調用Sneaky.__init__
。 Sneaky.__init__
的super().__init__(*args, **kwargs)
調用Person.__init__
。 如果從Sneaky.__init__
中刪除了super().__init__
調用,那么t.human
會提升
AttributeError: 'Thief' object has no attribute 'human'
因為Person.__init__
不會被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.