认识Python继承:super

认识Python继承:super,第1张

        前言:继承是Python编程中重要环节,但是需要注意的点比较多,下面我们就一起来康康吧。

一、继承是什么?都能继承什么?

        继承:子类继承父类,继承后就拥有父类的可用的所有属性和方法

        可以继承:类属性,类方式、 _属性/_方法(浅私有)

        不可以继承: __属性/__方法(深私有):不能被继承

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        pass

    def name(self):
        print("我是父类")


class B_test(A_test):  #继承父类(A_test)

    def jicheng(self):
        print("打印父类的_sex:",A_test._sex) #调用父类(A_test)中的,浅私有属性:_sex
        # print("打印父类的__age:",A_test.__age)  #这里调用就会报错,因为__age上父类是深浅私有属性


cl = B_test() #实例化
cl.jicheng()  #调用子类的jicheng方法



响应:

打印父类的_sex: 男
二、可以多继承吗?

答:python多继承 -- 继承多个父类 --

​​​​​​​继承的语法:
class 子类(父类1,父类2.....):
    PASS
子类继承父类,拥有父类所有属性和方法,除了私有化除外

三、可以继承构造方法(__init__)方法吗??

答:可以,但是分情况

a)情况1:子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__

解释:父类有__init__方法,子类没有时,自动调用父类的__init__方法

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        print("我是父类的构造方法")

    def name(self):
        print("我是父类")


class B_test(A_test):  #继承父类(A_test)
    
    #这里子类没写__init__方法,只能调用父类的方法
    
    def jicheng(self):
        pass


cl = B_test() #实例化
cl.jicheng()  #调用子类的jicheng方法


响应:

我是父类的构造方法
打印父类的_sex: 男
我是父类的构造方法
#这里看到有两个“我是父类的构造方法”打印,是因为第一次继承父类,父类自己运行了一次,子类没有构建方法,又调用了父类的构建方法,又打印了一次

b)情况2:子类如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__,语法格式如下:

解释:父类和子类都有__init__方法时,优先执行子类的__init__方法

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        print("我是父类的构造方法")

    def name(self):
        print("我是父类")


class B_test(A_test):  #继承父类(A_test)

    def __init__(self):
        print("我子类自己的__init__方法")

    def jicheng(self):
        pass


cl = B_test() #实例化
cl.jicheng()  #调用子类的jicheng方法


响应:

我子类自己的__init__方法

c)情况3:父类子类都有__init__方法 时,子类想调用父类的__init__的方法?

解释:——super(子类,self).__init__(参数1,参数2,....) =>super().__init__() 即可   

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        print("我是父类的构造方法,我在这里")

    def name(self):
        print("我是父类")


class B_test(A_test):  #继承父类(A_test)

    def __init__(self):
        print("我子类自己的__init__方法")

    def jicheng(self):
        super().__init__()  #继承父类__init__方法,但是默认执行顺序还是 子类__init__ > 父类 __init__



cl = B_test() #实例化
cl.jicheng()  #调用子类的jicheng方法

响应:
我子类自己的__init__方法
我是父类的构造方法,我在这里

四、可以重写父类方法吗?

答:情况1——可以,然后全部重写父类方法

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        print("我是父类的构造方法,我在这里")

    def name(self):
        print("我是父类的姓名")

    def age(self):
        print("我是父类的年龄")


class B_test(A_test):  #继承父类(A_test)

    def __init__(self):
        print("我子类自己的__init__方法")

    def name(self): #与父类方法同名,直接重写父类方法
        print("我是重写你的子类方法")

    def verify(self):
        self.name()  



cl = B_test() #实例化
cl.verify()  #调用子类的jicheng方法


响应:
我子类自己的__init__方法
我是重写你的子类方法

答:情况2——可以,在父类方法上增加功能

class A_test: #父类

    __age = 18
    _sex = "男"

    def __init__(self):
        print("我是父类的构造方法,我在这里")

    def name(self):
        print("我是父类的姓名")

    def age(self):
        print("我是父类的年龄")


class B_test(A_test):  #继承父类(A_test)

    def __init__(self):
        print("我子类自己的__init__方法")

    def name(self): #与父类方法同名,增加父类的方法功能
        super().name()
        print("我是重写你的子类name方法")

    def verify(self):
        self.name()



cl = B_test() #实例化
cl.name()  #调用子类的jicheng方法

响应:
我子类自己的__init__方法
我是父类的姓名
我是重写你的子类name方法

五、完整例子

class Father:  #新建一个父类
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def enr_money(self,wokr):
        print("{}靠{}工作赚钱".format(self.name,wokr))
    def hooby(self,favirate):
        print("{}的爱好:{}".format(self.name,favirate))


class Son(Father): ##WWclass 子类(父类1,父类2.....)继承
    def study(self,content):###你想在父类的功能或者属性以外,添加属于你自己特色的方法。
        print("我通过学习{}来提升自己".format(content))

    def enr_money(self,wokr1):#在与父类同名的方法的内,想调用父类的同名方法
        super().enr_money(wokr1)##super().超类来使用父类的方法
        print("{}通过{}投资理财再赚了 2000块!!!!".format(self.name,wokr1))###在父类的基础上,额外增加了,父类原基础上的不会变

    # def enr_money(self, work1,work2):  # 在与父类同名方法,但是我要完全重写。不用父类的代码。
    #     print("{} 通过{} 和{}来赚钱".format(self.name,work1,work2))




mama = Father("老汪",41) #继承后依然拥有父类所有属性和方法,除了私有化除外,所以这里都是需要填参数的
mama.enr_money("工地")
mama.hooby("看电影")

wang = Son("小汪",22)
wang.study("柠檬班")
wang.enr_money("基金")


响应:

老汪靠工地工作赚钱
老汪的爱好:看电影
我通过学习柠檬班来提升自己
小汪靠基金工作赚钱
小汪通过基金投资理财再赚了 2000块!!!!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/735174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存