• python面向对象——类的继承


    转自:https://blog.csdn.net/yilulvxing/article/details/85374142

    子类:Son类
    父类:Father类
    以下案例均表示Son类继承父类的一些属性和初始化参数构造等。

    5个模块:

    (1):直接调用父类属性方法;

    (2):重写父类属性方法;

    (3):强制调用父类私有属性方法;

    (4):调用父类的__init__方法

    (5):继承父类初始化过程中的参数

    (1)调用父类属性方法

    class Father():
        def __init__(self):
            self.a='aaa'  
        def action(self):
            print('调用父类的方法')
     
    class Son(Father):
        pass
     
    son=Son()     # 子类Son 继承父类Father的所有属性和方法
    son.action()  # 调用父类方法
    son.a         # 调用父类属性

    (2)重写父类属性方法

    class Father():
        def __init__(self):
            self.a='aaa'
        
        def action(self):
            print('调用父类的方法')
     
    class Son(Father):
        def __init__(self):
            self.a='bbb'
        def action(self):
            print('子类重写父类的方法')
     
    son=Son()     # 子类Son继承父类Father的所有属性和方法
    son.action()  # 子类Son调用自身的action方法而不是父类的action方法
    son.a

    这里,子类Son已经重写了父类Father的action的方法,并且子类Son也有初始化,因此,子类会调用自身的action方法和属性。总结:如果子类没有重写父类的方法,当调用该方法的时候,会调用父类的方法,当子类重写了父类的方法,默认是调用自身的方法。

    另外,如果子类Son重写了父类Father的方法,如果想调用父类的action方法,可以利用super()

    #如果在重新父类方法后,调用父类的方法
    class Father():
        def action(self):
            print('调用父类的方法')
     
    class Son(Father):
        def action(self):
            super().action()
    son=Son()
    son.action()

    (3)强制调用父类私有属性方法

    class Father():
        def __action(self):  # 父类的私有方法
            print('调用父类的方法')
     
    class Son(Father):
        def action(self):
            super()._Father__action()
    son=Son()
    son.action()

    (4)调用父类的__init__方法

    如果自己也定义了 __init__ 方法,那么父类的属性是不能直接调用的,比如下面的代码就会报错

    class Father():
        def __init__(self):
            self.a=a
     
    class Son(Father):
        def __init__(self):
            pass
        
    son=Son()
    print(son.a)

    修改方法:可以在 子类的 __init__中调用一下父类的 __init__ 方法,这样就可以调用了

    class Father():
        def __init__(self):
            self.a='aaa'
     
    class Son(Father):
        def __init__(self):
            super().__init__()
            #也可以用 Father.__init__(self)  这里面的self一定要加上
    son=Son()
    print(son.a)

    (5)继承父类初始化过程中的参数

    class Father():
        def __init__(self):
            self.a=1
            self.b=2
     
    class Son(Father):
        def __init__(self):
            super().__init__()
            #也可以用 Father.__init__(self)  这里面的self一定要加上
        def add(self):
            return self.a+self.b
    son=Son()
    print(son.add())

    上述代码中,父类在初始化过程中,直接对a,b分别赋值1,2。子类利用super().__init__()继承了父类的初始化参数a和b,所以子类调用自身的add函数(add函数返回a和b的和)会返回结果值。

    再看一下,如果不对父类初始化直接赋值,并且子类在调用父类初始化过程中,增加额外自身需要的初始化参数值。

    说明:三个参数a,b,c,其中a,b来自父类初始化参数,c表示子类初始化参数,但又分为两种情况:

    1):参数c为初始化默认参数,如下面的5.1代码中Son(1,2),参数1,2分别表示a,b的值,默认为c=10,即等于:Son(1,2,10),表明初始化传参过程中c可以不写

    2):显式地将初始化参数c修改为其他值,如下面的5.2代码中Son(1,2,1),参数值1,2,1分别表示a,b,c的值,即显式地将c=1传入

    具体代码如5.1 , 5.2所示,对比查看:

    #5.1
    class Father():
        def __init__(self,a,b):
            self.a = a
            self.b = b
        def dev(self):
            return self.a - self.b
     
     #调用父类初始化参数a,b并增加额外参数c
    class Son(Father):
        def __init__(self,a,b,c=10):  # 固定值: 例如默认c=10,也可以显示地将c赋值
            Father.__init__(self,a,b)  
            self.c = c
        def add(self):
            return self.a+self.b
        def compare(self):
            if self.c > (self.a+self.b):
                return True
            else:
                return False
            
    son=Son(1,2)         # 由于c在初始化过程中默认为10,所以c可以不用显示表达出来
    print(son.dev())     # 调用父类dev函数
    print(son.add())     # 子类自身add函数
    print(son.compare()) # 子类自身compare函数

    如果将上述5.1代码中,修改c为其他参数值(非默认值),改成显式地将c值传入

    #5.2
    class
    Father(): def __init__(self,a,b): self.a = a self.b = b def dev(self): return self.a - self.b #调用父类初始化参数a,b并增加额外参数c class Son(Father): def __init__(self,a,b,c=10): # 固定值: 例如默认c=10,也可以显示地将c赋值 Father.__init__(self,a,b) self.c = c def add(self): return self.a+self.b def compare(self): if self.c > (self.a+self.b): return True else: return False son=Son(1,2,1) # 显示地将c=1传入子类初始化函数 print(son.dev()) # 调用父类dev函数 print(son.add()) # 子类自身add函数 print(son.compare()) # 子类自身compare函数
  • 相关阅读:
    Cordova原理一
    View 的measure 和onMeasure
    Android Material Design 系列之 SnackBar详解
    android 透明状态栏方法及其适配键盘上推(二)
    android 透明状态栏方法及其适配键盘上推(一)
    Https握手协议以及证书认证
    App对接支付宝移动支付功能
    ViewPager 滑动一半的判断方法以及左滑右滑判断
    mvp架构解析
    解决IE8打开默认弹出开发者工具的问题
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/12737660.html
Copyright © 2020-2023  润新知