[英]How to call the __init__ method of the mothe class?
我有以下錯誤: Error Traceback (most recent call last): line 25,line 14,line 3 AttributeError: 'str' object has no attribute 'Teamname'
這是我的python代碼:
class Team:
def __init__(self,Name = "Name",Origin= "india"):
self.Teamname = Name
self.Teamorigin= Origin
def DefTeamname(self,Name):
self.Teamname = Name
def defTeamorigin(self,Origin):
self.Teamorigin = Origin
class Player(Team):
def __init__(self,Pname,Ppoints,Tname,Torigin):
Team.__init__(Tname,Torigin)
self.Playername = Pname
self.Playerpoints = Ppoints
def Scoredpoint(self):
self.Playerpoints += 1
def __str__(self):
return self.Playername + "has scored" + str(self.Playerpoints) + "points"
Player1 = Player('Sid',0,'Gokulam','Kochi')
print(Player1)
我究竟做錯了什么?
class Player(Team):
def __init__(self,Pname,Ppoints,Tname,Torigin):
super().__init__(Tname,Torigin)
...
你不能在類上自己調用__init__
,你需要使用super()
符號在實例上調用,否則self
參數將不會被正確綁定
拋出您的錯誤是因為__init__
的第一個參數被解釋為self
,因此__init__
試圖改變它。 它完全有效,因為您使用關鍵字參數,所以Origin
只是回退到默認值。
請注意,為了完整起見,您可以直接在目標類(或任何其他類)上調用該方法,但該self
不受約束,並且您失去了super()
始終指向 MRO 中的父級的優勢。 這有效:
class A:
def __init__(self, a):
self._a = a
class B:
def __init__(self, a, b):
self._b = b
A.__init__(self, a)
b = B(6, 7)
assert b._a == 6
順便說一句,這表明__init__
只是一個函數,它接受一個可變的第一個 arg(按照慣例是self
)並改變那個 arg。
但是,您確實應該使用super()
。 如果我重新定義 A 會發生什么?:
class newA:
def __init__(self):
self._other = True
class A(newA):
...
如果您一直使用super()
,一切都會正常工作:
class NewA:
def __init__(self, **kwargs):
super().__init__(**kwargs)
class A(NewA):
def __init__(self, a=None, **kwargs):
self._a = a
super().__init__(**kwargs)
請注意使用關鍵字參數將鏈向上傳遞,而不必擔心每個類的 init 的語義。
如果不保持語義兼容, Python 的超級被認為是有害的警告有關事情可能會出錯的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.