python3多重継承の問題

Pythonの多重継承で#、呼び出されたときに、複数のサブクラスはサブクラスで、親クラスが同じ名前のメソッドが含まれて継承している場合は、選択されます

class Item :
    def info (self):
        print("Item中的方法","这是一个商品")

class Product:
    def info(self):
        print("Product中的方法" , "这是一个工业产品")

class Mouse(Item, Product):
    pass

m = Mouse()
m.info()

出力:
商品ですメソッド項目で、

class Item :
    def info (self):
        print("Item中的方法","这是一个商品")

class Product:
    def info(self):
        print("Product中的方法" , "这是一个工业产品")

class Mouse(Product, Item):
    pass

m = Mouse()
m.info()

出力:
この製品の方法は、工業製品である
要約:
あなたはの上面に継承された親クラスのメソッドを呼び出したときに目に見える多重継承、親クラスはメソッドと同じ名前を持つ、サブクラスは選ぶだろう
拡大を:
子クラスは、同じ名前のメソッドが含まれている場合、サブクラスは、同じメソッドを呼び出し、書き換えと呼ばれる彼の好ましい方法は、また、オーバーライドを覆う呼ば

class Item :
    def info (self):
        print("Item中的方法","这是一个商品")

class Product:
    def info(self):
        print("Product中的方法" , "这是一个工业产品")

class Mouse(Item, Product):
    def info(self):
        print("这是一个鼠标")

m = Mouse()
m.info()

出力:
これはマウスであります

1を展開します。

継承されたクラスと同名以上で親中性子の方法は、親クラスのメソッドクラス掛け布団カバーメソッドは、私はまだ親クラスのメソッドを呼び出したい、そしてどのように行いますか?


Pythonクラス空間に対応するクラス、および空間クラスクラスメソッド本質的にはPythonに相当従って機能。
したがって、この方法は一例であっても、Pythonは、クラス名の通話を可能にします。差があること:インスタンスメソッドのクラス名によって呼び出され、Pythonは自動結合パラメータ値パラメータ自己の方法の第1の例ではなく、明示的に第1のパラメータバインド自己をプログラムする必要性。このメカニズムは、非結合的なアプローチとして知られています。


コードを見てください:


# 在Python的多继承中,如果子类继承的多个父类中包含了同名的方法,子类在调用时会选择哪个  
class Item :
    def info (self):
        print("Item中的方法","这是一个商品")

class Product:
    def info(self):
        print("Product中的方法" , "这是一个工业产品")

class Mouse(Item, Product):
    def info(self):
        print("这是一个鼠标")
    def all_method(self):
        self.info() #子类的info方法
        Item.info(self) #Item父类的info方法
        Product.info(self) #Product父类的info方法

m = Mouse()
m.all_method()

出力:
これはマウスである
。これは、内商品です方法項目
本製品の方法は、工業製品れる
すべての情報のメソッドが呼び出される。この方法を示しています

2を展開します。

スーパーコンストラクタ関数は、親クラスを呼び出して使用する
コンストラクタメソッドは、組み込みのPythonの特別なので、その多重継承は、親クラスのコンストラクタを呼び出す方法のサブクラス考慮されなければならない、クラスでは非常に一般的です。


class Employee:
    def __init__(self, salary):
        self.salary = salary
    def work(self):
        print("普通员工正在写代码,工资是:", self.salary)

class Customer:
    def __init__(self, favorite, address):
        self.favorite = favorite
        self.address = address
    def info(self):
        print("我是一个顾客,我的爱好是%s, 地址是%s" %(self.favorite, self.address))

class Manger(Employee, Customer):
    pass

m = Manger(5000) #子类继承的是父类Employee的构造方法
m.work() #
m.info() #出错,因为info中使用了Customer中定义的构造属性,但是子类并没有从Customer中继承favorite, address属性

施工方法は、彼はあなたがサブクラス継承の親クラスのinitメソッドを継承していない場合は、他の方法で使用されているオブジェクトの属性を初期化するので、その後、親クラスのメソッドの一部を再利用し、非常に特別であるので、エラーが発生します、継承された最大のマルチプレックスは再利用されていない場合、我々はすべての親クラスのinitメソッドサブクラスの継承で親クラスのコンストラクタをオーバーライドする必要がありますのでビットは、その後、継承は、意味がないですが、また、サブクラスを拡張することができますプロパティ。二つの方法で、親クラスから継承したinitメソッド:

  1. 未結合の方法を使用して、このアプローチは、理解しやすいです。インスタンスコンストラクタメソッドであるため、当然のことながら、あなたは、このような方法で呼び出すことができます。
  2. スーパー()関数を使用すると、親クラスのコンストラクタを呼び出します。

class Employee:
    def __init__(self, salary):
        self.salary = salary
    def work(self):
        print("普通员工正在写代码,工资是:", self.salary)

class Customer:
    def __init__(self, favorite, address):
        self.favorite = favorite
        self.address = address
    def info(self):
        print("我是一个顾客,我的爱好是%s, 地址是%s" %(self.favorite, self.address))

# class Manager(Employee, Customer):
#     pass
#
# m = Manager(5000) #子类继承的是父类Employee的构造方法
# m.work() #
# m.info() #出错,因为info中使用了Customer中定义的构造属性,但是子类并没有从Customer中继承favorite, address属性

class Manager(Employee, Customer):
    def __init__(self, salary, favorite, address, occupation): #重写init,要写所有父类中的init属性,同时可以添加子类的属性occupation
        self.occupation = "new add"
        print("这是Manager类的构造方法")
        # 继承Employee中的init方法,super方法,两种写法都可以
        # super().__init__(salary) #super写法1
        super(Manager, self).__init__(salary) #super写法2
        # 继承Customer方法,通过调用未绑定的方法,显式传递self
        Customer.__init__(self, favorite, address)

        print("我是子类Manager 初始化方法init中定义的属性:", self.occupation)

m = Manager(5000, 'sing', 'china', 'IT')
m.work()
m.info()

おすすめ

転載: blog.51cto.com/13560219/2453833