Pythonクラス継承のバグ

     最近クラス継承を書いているときに、Pythonの継承では、親クラスのコンストラクターを呼び出すために基本クラスのパラメーターを変更する必要があることがわかりました。親クラスを継承した後、特に多重継承の場合、パラメーターが転送されることがわかりました。最後に、親クラスを変更しました。メンバー変数の順序は成功しています(他のアイデアを持つ同僚は、自分の考えを残すことができます。問題を解決することしかできず、理由は見つかりませんでした)。質問とすべてのコードがgithubにアップロードされました。

要件は次のとおりです

Itemは親クラスであり、メンバー変数はnameとaomuntであり、メンバー関数はそれぞれ購入、販売、および取得操作です。

まず、NewBookのサブクラスはItemを継承する必要があり、amont変数のみが使用され、名前は固定文字列です。また、メンバー変数とメンバーメソッドのみを継承でき、NewBookはItemメソッドと変数を上書きできません。著者は、次のコードのサブクラスNewBookの2つのメソッドを使用して、親クラスの構築メソッドを呼び出しますが、すべて失敗します。そして、同じエラーを報告しました!

 

#父类
class Item(object):
    def __init__(self,name,amount):
        self.name = name
        self.amount = amount
        
    def buy(self, number):
        self.amount += number

    def sell(self, number):
        self.amount -= number
     
        
    def getName(self):
        return self.name
        
    def getAmount(self):
        return self.amount


#子类
class NewBook(Item):
    def __init__(self,amount):
        #Item.__init__(self,name = "new book",amount)  #第一种方法调用父类构造函数
        super(NewBook, self).__init__(name = "new book"amount)  #第2种方法调用父类构造函数
        
    def buy(self):
        Item.buy(self, number=10)
    
    def sell(self):
        Item.sell(self, number=1)

最初の工法の結果: 

 

2番目の方法は、エラー結果を報告します。

 渡したい名前は固定パラメーターであり、aomuntはユーザー定義パラメーターであるため、このようにのみ渡すことができます。それでは、なぜ親クラスのコンストラクターに渡せないのか、親クラスのコンストラクターが渡されたパラメーターを認識しなかったのか?親クラスのパラメーターの受け渡し順序を変更したところ、この問題は解決しました(問題タイトルに記載)

class Item(object):
    def __init__(self,amount,name):   #改变部分
        self.name = name
        self.amount = amount
       
        
    def buy(self, number):
        self.amount += number
        

    def sell(self, number):
        self.amount -= number
        
        
    def getName(self):
        return self.name
        
    def getAmount(self):
        return self.amount
        

class NewBook(Item):
    def __init__(self,amount):
       
        super(NewBook, self).__init__(amount,name = "new book") #改变部分
        
    def buy(self):
        Item.buy(self, number=10)
    
    def sell(self):
        Item.sell(self, number=1)

デフォルトのパラメータを渡した後、金額は前に配置されます

 

理由と分析をさらに理解する必要がある場合は、倉庫に直接アクセスして表示できます。問題の背景とすべてのコードがgithubにアップロードさています

おすすめ

転載: blog.csdn.net/qq_39463175/article/details/107734171