Python継承


一、継承
Pythonのオブジェクト向け継承とは、複数のクラス間の所属関係、すなわち、子クラスが親クラスのすべての属性とメソッドをデフォルトで継承することを意味します.
1.単一継承
class A(object):
    def __init__(self):
        self.num = 1

    def print_info(self):
        print(self.num)
class B(A):
    pass
b = B()
b.print_info()

Pythonでは、すべてのクラスがデフォルトでobjectクラスを継承し、objectクラスはトップクラスクラスまたはベースクラスである.他のサブクラスは派生クラスと呼ばれます.
2.マルチ継承
マルチ継承とは、1つのクラスが複数の親を同時に継承することを意味します.
class Master(object):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        print(f"  {self.kongfu}      ")


class School(object):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        print(f"   {self.kongfu}      ")


class Pretice(School, Master):
    pass


p = Pretice()
print(p.kongfu)
p.make_cake()

注:1つのクラスに複数の親がある場合、デフォルトでは最初の親の同名属性とメソッドが使用されます.
3.子の親の同名属性と書き換え方法
子クラスと親クラスに同じ名前のプロパティとメソッドがある場合は、デフォルトでは子クラスの同じ名前のプロパティとメソッドが使用されます.
4.子クラスが親クラスの同名属性とメソッドを呼び出す
class Master(object):
    def __init__(self):
        self.kongfu = "        "

    def make_cake(self):
        print(f"  {self.kongfu}      ")


class School(object):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        print(f"   {self.kongfu}      ")


class Pretice(School, Master):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        #           :            ,kongfu          init  kongfu  
        self.__init__()
        print(f"   {self.kongfu}      ")

    #               :               
    def make_master_cake(self):
        #     .  ()
        #           :                ,   init     
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)


p = Pretice()
p.make_master_cake()
p.make_school_cake()
p.make_cake()
print(Pretice.__mro__)  #         

5.多層継承
class Master(object):
    def __init__(self):
        self.kongfu = "        "

    def make_cake(self):
        print(f"  {self.kongfu}      ")


class School(object):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        print(f"   {self.kongfu}      ")


class Pretice(School, Master):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        #           :            ,kongfu          init  kongfu  
        self.__init__()
        print(f"   {self.kongfu}      ")

    #               :               
    def make_master_cake(self):
        #     .  ()
        #           :                ,   init     
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)


class TuSun(Pretice):
    pass

p = TuSun()
p.make_cake()
p.make_master_cake()
p.make_school_cake()
print(Pretice.__mro__)  #         

6.supper()呼び出し親メソッド
class Master(object):
    def __init__(self):
        self.kongfu = "        "

    def make_cake(self):
        print(f"  {self.kongfu}      ")

class School(Master):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        print(f"   {self.kongfu}      ")
        # super(School, self).__init__()
        # super(School, self).make_cake()
        # 2.2    
        super().__init__()
        super().make_cake()

class Pretice(School):
    def __init__(self):
        self.kongfu = "      "

    def make_cake(self):
        #           :            ,kongfu          init  kongfu  
        self.__init__()
        print(f"   {self.kongfu}      ")

    #               :               
    def make_master_cake(self):
        #     .  ()
        #           :                ,   init     
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)

    def make_old_cake(self):
        #    :        ,       ,  ,     ,  
        # School.__init__(self)
        # School.make_cake(self)
        # Master.__init__(self)
        # Master.make_cake(self)
        #    :supper
        # 2.1 supper(    , self).  ()
        # super(Pretice, self).__init__()
        # super(Pretice, self).make_cake()
        # 2.2    
        super().__init__()
        super().make_cake()

p = Pretice()
p.make_old_cake()

注:supper()を使用すると、親を自動的に検索できます.呼び出し順序は__に従うmro __クラス属性の順序は、単一継承の使用に適しています.
二、私有権限
1.プライベート属性とメソッドの定義
Pythonでは、インスタンス属性とメソッドにプライベート権限を設定できます.すなわち、インスタンス属性またはメソッドがサブクラスに継承されないように設定できます.プライベート権限を設定する方法:属性名とメソッド名の前に下線_を2つ追加します.
class A(object):
    def __init__(self):
        self.name = "  "
        self.age = 36
        self.__salary = 8000
    def print_info(self):
        print(f"{self.name}, {self.age}, {self.__salary}")

class B(A):
    pass

b = B()
print(b.print_info())

注意:プライベート属性とプライベートメソッドは、クラス内でのみアクセスおよび変更できます.
2.プライベート属性の取得と変更
Pythonでは、一般定義関数名get_xxはプライベート属性を取得し、set_を定義するために使用されます.xxは、プライベート属性値を変更するために使用されます.
class A(object):
    def __init__(self):
        self.name = "  "
        self.age = 36
        self.__salary = 8000
    def print_info(self):
        print(f"{self.name}, {self.age}, {self.__salary}")

    #        
    def get_money(self):
        return self.__salary
    
    #        
    def set_money(self, salary):
        self.__salary = salary

class B(A):
    pass

b = B()
print(b.get_money())
b.set_money(10000)
print(b.get_money())