python-継承&派生組み合わせ&

派生継承&

何継承されています

継承は、クラスとクラス間の関係を参照のPyで「親子関係」で、継承は、新しいクラスを作成する方法です

新しいクラスは、新しいクラスはサブクラスまたは派生クラスと呼ばれ、一つ以上の親クラスを継承することができ、親クラスは、基本クラスまたはスーパークラスとして知られています

サブクラスは、後継機能の一つは、コードの再利用の問題を解決することであり、そう言って、プロパティとメソッド親クラスの特性を継承することができます

シングル&多重継承の継承

単一継承:サブクラス継承一つだけの親

多重継承:サブクラス継承つ以上の親クラス

class ParentClassA: # 定义父类
    pass
class ParentClassB: # 定义父类
    pass
class SubClass1(ParentClassA):  # 单继承,定义子类时把父类名放在括号中即可
    pass
class SubClass2(ParentClassA, ParentClassB): # 多继承,继承时,多个父类用逗号隔开
    pass

継承されたメソッドを見ます

クラス名.__ base__:左から右への唯一の最初の継承されたクラスを参照するには

クラス名.__ bases__:ビューすべての継承された親クラス

print(SubClass1.__base__)  
print(SubClass2.__base__)
print(SubClass1.__bases__)
print(SubClass2.__bases__) 

出力:

<クラスの .ParentClassA '>
<クラスの .ParentClassA'>
(<クラスの .ParentClassA '>)
(<クラスの .ParentClassA'>、<クラスの .ParentClassB '>)

クラシック&新クラス

PY2クラスサブクラシックと新しいクラス、新しいデフォルトカテゴリとしてPY3内のすべてのクラスが同じで

PY2古典的なクラス:クラスの表示なしクラス継承オブジェクトクラスとサブクラス、それは古典的なクラスであります

新しいクラスでPY2:彼らが表示されたときにオブジェクトクラスを継承したクラス宣言と同様に、このクラスのサブクラス、彼らは新しいクラスです

PY3継承されたオブジェクトクラス、オブジェクトクラスがデフォルトで継承されるかどうかに関係なく、

  • あなたは、基本クラスを指定しない場合、PY3は(例えば、__ str__)オブジェクトクラスは、一般的な方法を提供し、デフォルトのオブジェクトクラスを継承します
ParentClassA.__bases__   # 打印 (<class 'object'>,)

まず抽象その後、継承

抽象すなわち、より類似または同様抽出部はカテゴリ抽象作用に分割される(問題分離、複雑さを低減します)

継承は、プログラミング言語は、継承の仕方によって抽象的結果を表現するために、抽象化のプロセスを通過し、それを実装するために、抽象的な結果に基づいています

ただ、抽象プロセスの分析と設計、アクションやスキル、抽象分析クラスによって得られたプログラム

物件検索順序

オブジェクトがそのプロパティにアクセスする場合は、オブジェクト自体の最初は、ノーかどうかを確認するには、名前空間、その後、何の場合は、そのクラスの名前空間を見つけていない。そして、トップの親まで見て親クラスがあれば探していますない場合、エラー。

分析:

class Foo:
    def f1(self):
        print('Foo.f1')
    def f2(self):
        print('Foo.f2')
        self.f1()
class Bar(Foo):
    def f1(self):
        print('Bar.f1')

b=Bar()
b.f2()

# 打印结果:
# Foo.f2
# Bar.f1
  • オブジェクトBはまず持って、その後、そのクラスのバーを見ない、)(そのプロパティf2のアクセスを後援 - なかった。その後、親クラスのFoo検索、F2を見つける();この時間は、関数f2を行うようになりました( )、最初の印刷 "Foo.f2" は、その後、self.f1()を呼び出します。この場合には、自己がオブジェクトbである、それは彼らが今のF1 Bを見つけるので、)(b.f1を実行するために等しいだろう)を実行self.f1(で、見つけることができません。そして、再クラスバーBで探して見つけて、印刷「Bar.f1」

継承の原則

原則の実装継承:クラスの定義、Pythonは親クラスのすべての順次リスト線形シンプルでメソッド解決順序(MRO)のリストを、計算します。「クラス名.mro()」ビューでは、「クラス名.__ mro__」を呼び出すことと同じです

Pyを呼び出すときに、プロパティを探す:左から右にそれはこれまでのところ、このプロパティクラスの最初の一致が見つかるまで、リスト上の親クラスのMROに探し始めます。

プロパティを検索:

  • 単一継承クラスのラインを見つけるに応じて継承されています。
  • マルチ継承されたクラスについては、MROのリストに来るために。

Pyが、多重継承のルックアップのために、MROに従って順のリストを見つけます。クラシックと新しいクラスが異なっています。

  • 深さの優先順位の原則に従い、クラシック
  • 幅の優先順位の原則に従い、新しいクラス

派生

サブクラスは、親クラスと同じ属性を自分の属性を定義することができ、親クラスには影響しません。

その注意し、再び属性とサブクラスと同じ名前、およびプロパティを呼び出し、サブクラスのオブジェクトは、それはサブクラスの対象となる親クラスを定義します

サブクラスは、親クラスのプロパティと同じ名前の新しい方法では、あなたは、どちらかの親クラスのメソッドプロパティを再利用するだけでなく、自分自身の新しい機能を追加することができます。

この場合、使用は正常な機能、すなわち、クラス名.FUNC()と呼ばれ、この場合には、(自身を含む)を手動で転送パラメータに必要、通常の関数コールからの違いはありません

class Hero:
    def __init__(self,nickname,aggressivity,life_value): # 父类方法属性
        self.nickname=nickname
        self.aggressivity=aggressivity
        self.life_value=life_value

class Riven(Hero):
    camp='Noxus'
    def __init__(self,nickname,aggressivity,life_value,skin):
        Hero.__init__(self,nickname,aggressivity,life_value) # 调用父类功能
        self.skin=skin  # 新属性

r1=Riven('锐雯雯',57,200,'比基尼')  # 子类对象初始化

サブクラスは親クラスのメソッドを呼び出します

新しいサブクラスは、多くの場合、2つの方法で実装親クラスのメソッドを、再利用する必要があり、派生しました:

方法:名前、すなわち、親プロセスの親クラス名()。

  • 上記の例では、このようにコードされ
  • ライJicheng関係を失敗し、この方法は、実際には、通常の関数呼び出しは、関係なく、相続のは、手動で転送パラメータに必要です。
class Vehicle: #定义交通工具类
     Country='China'
     def __init__(self,name,speed,load,power):
         self.name=name
         self.speed=speed
         self.load=load
         self.power=power

     def run(self):
         print('开动啦...')

class Subway(Vehicle): #地铁
    def __init__(self,name,speed,load,power,line):
        Vehicle.__init__(self,name,speed,load,power) # "指名道姓" 调用父类方法
        self.line=line

    def run(self):
        print('地铁%s号线欢迎您' %self.line)
        Vehicle.run(self)    # "指名道姓" 调用父类方法

第二の方法:スーパー()

  • 超超()。プロパティ([パラメータ])または(現在のクラス名、自己)。プロパティ([パラメータ])
  • 継承に依存スーパー方法; MROリスト内のスーパー
class Subway(Vehicle): #地铁
    def __init__(self,name,speed,load,power,line):
        #super(Subway,self) 就相当于实例本身 在python3中super()等同于super(Subway,self)
        super().__init__(self,name,speed,load,power)
        self.line=line

    def run(self):
        print('地铁%s号线欢迎您' %self.line)
        super(Subway,self).run()  # 等同于 super().run()
  • そして、そして何の継承がなくても、スーパーはまだMROリストに従って、将来を探し続けます

  • 日付を見つけるまで、次を見つけるために、MROのためのリストが続く、スーパーに遭遇した後、発見者に基づいて、

    #A没有继承B,但是A内super会基于C.mro()继续往后找
    class A:
        def test(self):
            super().test()
    class B:
        def test(self):
            print('from B')
    class C(A,B):
        pass
    
    c=C()
    c.test() #打印结果:from B
    
    
    print(C.mro())
    #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]

組み合わせ

定義の組み合わせ

その特性として、別のクラスの使用から派生したオブジェクトの組み合わせを意味する、すなわち、クラスの組合せ

クラスとクラスの組合せとの間の関係も反映される「有する」の関係

有意クラス、および小さい方の間で異なる、必要なクラスのより大きなクラスの構成要素である場合、より便利の組み合わせで、

class Student:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    
class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
    def tell_info(self):
        return "%s-%s-%s" %(self.year, self.month, self.day)

stu1 = Student("小明", 10, "male")
d = Date(2010, 8, 8)
stu1.birthday = d
print(stu1.birthday.tell_info())

おすすめ

転載: www.cnblogs.com/liuxu2019/p/12115901.html