2 回答

TA貢獻1780條經驗 獲得超5個贊
傳入*args意味著可以初始化你的Thieflike
>> x = Thief(True, False)
>> x.human
False
>> x.sneaky
True
這讀起來很混亂,并且很難通過多重繼承來跟蹤,但它可能很有用。保持這種能力意味著你可以做
sneaky = (True, False, True,)
human = (True, False, False,)
thieves = [Thief(*args) for args in zip(sneaky, human)]
這有點做作,但我認為它說明了為什么您可能希望允許位置參數。
如果您確實想刪除*args并且不支持位置參數,您也可以通過添加after來將它們從Sneakyand中排除。Person*,self,
class Sneaky:
def __init__(self, *, sneaky=False, **kwargs):
super().__init__(**kwargs)
self.sneaky = sneaky
class Person:
def __init__(self, *, human=False, **kwargs):
super().__init__(**kwargs)
self.human = human
這不會將所有位置參數放入未命名的*. TypeError如果您嘗試提供位置論證,這將引發 a 。

TA貢獻1995條經驗 獲得超2個贊
在第一種情況下,以下代碼將輸出True。
t = Thief(True, True)
print(t.human)
# True
但在第二個(沒有*args) - 它會引發異常:
t = Thief(True, True) # arguments without keywords
print(t.human)
# raises
# TypeError: __init__() takes 1 positional argument but 3 were given
添加回答
舉報