python的类继承总结

参考文档:

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

总结如下:

第一种情况: 子类和父类都有 __init__(self)方法情况继承研究
#如果子类也有init方法,那么调用父类的实例属性必须要在子类的init()方法中有这个super().__init__()【这点尤其要注意】
# 如果子类也有init方法,调用父类的类属性(注意不是实例属性),不是必须要在子类的init()方法中写super().__init__(),写不写都可以调用成功
# 如果子类也有init方法,调用父类的实例方法,不是必须要在子类的init()方法中写super().__init__(),写不写都可以调用成功


第二种情况:子类没有 __init__(self)方法,父类有 __init__(self)方法情况继承研究
# 子类没有 __init__(self)方法,可直接用子类对象调用父类实例属性成功 【子类没有init方法,相当于实例化的时候直接用的父类的__init__()方法】


第三种情况: 子类重写父类方法(即子类方法名和父类的方法名相同)

  如果子类没有重写父类的方法,当调用该方法的时候,会调用父类的方法,当子类重写了父类的方法,默认是调用自身的方法。

  另外,如果子类Son重写了父类Father的action方法,如果想调用父类的action方法,可以利用super() 【这点尤其要注意】

 

"""子类和父类都有 __init__(self)方法情况继承研究"""
class A:
    m = 3
    def __init__(self):
        self.a = 1
    def dog(self):
        print("dog")

class B(A):

    def __init__(self):
        # super().__init__()
        #如果子类也有init方法,那么调用父类的实例属性必须要有这个super().__init__()
        # self.a1 = self.a #调用父类的实例属性
        # 如果子类也有init方法,调用父类的类属性(注意不是实例属性),不是必须要写super().__init__(),写不写都可以调用成功
        self.m1 = self.m   #调用父类的类属性

    def check(self): #父类的实例属性
        print(self.a1)

    def cat(self): #父类的类属性
        print(self.m1)

    def son_dog(self):#子类和父类的方法不同名的时候,调用父类的方法能用self.父类方法
        # 如果子类也有init方法,调用父类的实例方法,不是必须要写super().__init__(),写不写都可以调用成功
        self.dog() #子类和父类的方法不同名,调用父类方法

    def dog(self):  #子类和父类的方法同名的时候,调用父类的方法不能用self.父类方法,只能用super().父类方法
        # 如果子类也有init方法,调用父类的实例方法,不是必须要写super().__init__(),写不写都可以调用成功
        super().dog() #子类和父类的方法同名,调用父类方法

if __name__ == '__main__':
    oj = B()
    oj.son_dog()
    oj.dog()
    oj.cat()

 

"""子类没有 __init__(self)方法,父类有 __init__(self)方法情况继承研究"""

class Father():
    def __init__(self):
        self.a = 'aaa'

    def action(self):
        print('调用父类的方法')

class Son(Father):
    pass


son = Son()  # 子类Son 继承父类Father的所有属性和方法
son.action()  # 调用父类方法

print(son.a)         # 子类没有 __init__(self)方法,直接用子类对象调用父类实例属性成功

 







posted @ 2023-04-01 22:57  Just_ho  阅读(81)  评论(0编辑  收藏  举报