ゼロベース入門python 3.7-基礎知識総括(二十三)親を書き換える方法とsuper()関数

3385 ワード

一.親の書き換え方法
継承メカニズムがあるためです.したがって、子クラスは親クラスのすべての属性とメソッドを継承できます.しかし、親から子を継承する方法では、ほとんどが子に適している場合があります.しかし、一部の方法では親を直接照らすことはできません.これらの方法を変更しない場合.では、サブクラスは使用できません.したがって、親のメソッドを子クラスで繰り返す必要があります.
  • すべての雌鶏にとって歩くことができます.しかも翼がある.しかも卵を産むことができます.
    class Hen:
        def LayAEegg(self):
            print("    ")
    
        def wing(self):
            print("    ")
    
        def fly(self):
            print("   ")

    雄鶏にとって卵は産まない.だから雌鶏の方法を受け継ぐと同時に卵を産む方法を修正します
    class Hen:
        def LayAEegg(self):
            print("    ")
    
        def wing(self):
            print("    ")
    
        def fly(self):
            print("   ")
    
    class Cock(Hen):
        def fly(self):
            print("     ")
  • 書き換えは、上書きとも呼ばれる場合があり、クラス内の既存のメソッドの内部実装を修正することを意味する.
  • class Hen:
        def LayAEegg(self):
            print("    ")
    
        def wing(self):
            print("    ")
    
        def fly(self):
            print("   ")
    
    class Cock(Hen):
        def fly(self):
            print("     ")
    
    a = Cock()
    a.fly()
    
         
    
  • 親から継承されたメソッドが子から書き換えられた場合.クラスの外部でサブクラスオブジェクトを介してメソッドが呼び出されると、サブクラスで書き換えられるメソッドが常に実行されます.これは、親クラスのメソッドを呼び出すことができないことを意味します.実はそうではありません.クラスは独立した空間と見なすことができ、それはクラスメソッド、すなわちその空間の関数を意味する.では、クラス内のメソッドをグローバルに呼び出す場合.関数を呼び出すときにクラス名を用意するだけでいいです.
  • class Hen:
        def LayAEegg(self):
            print("    ")
    
        def wing(self):
            print("    ")
    
        def fly(self):
            print("   ")
    
    class Cock(Hen):
        def fly(self):
            print("     ")
    
    a = Cock()
    Hen.fly(a)
    
       
    
  • クラス名呼び出しメソッドを使用する場合selfはバインドされません.手動でバインドします.

  • 二.super()関数
    子クラスが親クラスのすべての属性とメソッドを継承できる以上.親クラスのコンストラクション関数も例外ではありません.それ以外にpythonの継承言語が多いです.1つのサブクラスが複数の親クラスの同名のクラスインスタンスメソッドを同時に継承している場合.サブクラスオブジェクトでメソッドが呼び出された場合.を選択すると、前の親クラスのインスタンスメソッドが優先されます.構造方法もこのような原則に従う.
    class Person:
        def __init__(self, name):
            self.name = name
    
        def getName(self):
            print(self.name)
    
    
    class Person1:
        def __init__(self, age):
            self.age = age
    
        def getAge(self):
            print(self.age)
    
    
    class Person2(Person, Person1):
        pass
    
    a =Person2("  ")
    
    a.getName()
    a.getAge()
    
    
      
    Traceback (most recent call last):
      File "/Users/apple/Documents/    /python3/python21.py", line 23, in 
        a.getAge()
      File "/Users/apple/Documents/    /python3/python21.py", line 14, in getAge
        print(self.age)
    AttributeError: 'Person2' object has no attribute 'age'

    このような状況に鑑みて正しい方法は,サブクラス内の独自の構造方法を定義することである.しかし、注目すべきは.サブクラスで構築方法を定義します.親クラスの構築メソッドを呼び出す必要があります.2つの状況に分けられ、
  • クラスは、独立した空間と見なすことができる.クラスの外部でクラスのインスタンスメソッドを呼び出す.通常の関数を呼び出すようにできます.違いは、クラス名を手動でバインドすることです.
  • super()関数を使用します.しかし、いったん多継承にかかわると.この関数は、最初の直接親クラスの構築方法
  • のみを呼び出すことができる.
    class Person:
        def __init__(self, name):
            self.name = name
    
        def getName(self):
            print(self.name)
    
    
    class Person1:
        def __init__(self, age):
            self.age = age
    
        def getAge(self):
            print(self.age)
    
    
    class Person2(Person, Person1):
        def __init__(self, name, age):
            #   super()  
            super().__init__(name)
            #                        
            Person1.__init__(self, age)
    
    a = Person2("  ", 30)
    
    a.getName()
    a.getAge()
    
      
    30