簡體   English   中英

如何調用mothe類的__init__方法?

[英]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 的語義。

進一步閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM