pythonベース入門の16-継承

12988 ワード

一、定義
pythonのオブジェクトに対する継承とは、複数のクラス間の所属関係、すなわち、サブクラスが親クラスの属性とメソッドをデフォルトで継承することを意味します.
class A(object):
    def __init__(self):
        self.num=1
    def info_print(self):
        print(self.num)

#  B
class B(A):
    pass

resoult=B()
resoult.info_print()  #1

二、単一継承と多継承
  • 単一継承:
  • マルチ継承:1つのクラスが複数の親を同時に継承する
  • P.s:1つのクラスに複数の親がある場合、同名の属性とメソッドはデフォルトで最初の親を使用します.
    class A(object):
        def __init__(self):
            self.str = 'A      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    class B(object):
        def __init__(self):
            self.str = 'B      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    class C(A, B):
        pass
    
    class D(B, A):
        pass
    
    c = C()
    c.print_str()  #   A      
    d = D()
    d.print_str()  #   B      

    三、子クラス親クラスの同名メソッドと属性を書き換える
    子と親には同名の属性とメソッドがあり、デフォルトでは子の同名の属性とメソッドが使用されます.
    class A(object):
        def __init__(self):
            self.str = 'A      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    class B(object):
        def __init__(self):
            self.str = '  B      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    b = B()
    b.print_str()  #     B      

    四、子クラス呼び出し親クラスの同名メソッドと属性
    class A(object):
        def __init__(self):
            self.str = 'A      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    class B(object):
        def __init__(self):
            self.str = 'B      '
    
        def print_str(self):
            print(f'  {self.str}')
    
    class C(A, B):
        def __init__(self):
            self.str = '  C      '
    
        def print_str(self):
            print(f'  {self.str}')
    
        def print_self_str(self):
            self.__init__()
            self.print_str()
            # self     ,       self  ,        
            # self.print_str(self)          
    
        def print_A_str(self):
            A.__init__(self)
            A.print_str(self)
    
        def print_B_str(self):
            B.__init__(self)
            B.print_str(self)
    
    c = C()
    c.print_str()  #     C      
    c.print_self_str()  #     C      
    c.print_A_str()  #   A      
    c.print_B_str()  #   B      
    c.print_str()  #   B      
    c.print_self_str()  #     C      
    #     print_str()      ,            self.str
    
    # __mro__      
    print(C.__mro__)  
    # (, , , )

    五、多層継承
    eg:CクラスはBクラスを継承し、BクラスはAクラスを継承し、このような3世代以上を多層継承と呼ぶ.ルールと継承
    六、super呼び出し親メソッド
    super()を使用すると、親を自動的に検索できます.呼び出し順序は__に従うmro__クラス属性の順序.単一継承で使用するのに適しています.
    class A(object):
        def __init__(self):
            self.str='A      '
        def print_str(self):
            print(f'  {self.str}')
    
    class B(A):
        def __init__(self):
            self.str = 'B      '
    
        def print_str(self):
            # 1、 super()   
            # super(B, self).__init__()
            # super(B, self).print_str()
            # 2、 super()   
            super().__init__()
            super().print_str()
    
    class C(B):
        def __init__(self):
            self.str= 'C      '
    
        def print_str(self):
            # 1、 super()   
            # super(C,self).__init__()
            # super(C,self).print_str()
            # 2、 super()   
            super().__init__()
            super().print_str()
    
    c = C()
    c.print_str()  #   A      

    七、私有権限
  • サブクラスに継承できない属性とメソッドは、プライベート権限
  • を追加する必要がある.
  • プライベート権限は、外部から直接出力または
  • を使用することはできません.
  • 構文:プライベート属性とメソッドの違い名前の前に2つの下線
  • を付ける
    class   ():
        #    
        __    =  
       #     
        def  __   (self):