继承与派生

夙愿已清 提交于 2019-12-29 08:05:14

什么是继承

 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。

python中类的继承分为:单继承和多继承

class ParentClass1: #定义父类
    pass

class ParentClass2: #定义父类
    pass

class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass

  继承的信息

class Sup:
    __num = 10

    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        print(self)
        return self.__name

    @classmethod
    def __c_fn(cls):
        print(cls, 'c fn')

    def __o_fn(self):
        print(self.name, 'o fn')


class Sub(Sup):
    def test(self):
        print(self)
        print(self.__name)
    pass

 

继承关系
1.父类的所有未封装的属性和方法,子类都能访问
2.父类的所有封装的属性和方法,子类都不能访问
-- 在外界通过子类或子类对象,不能访问
-- 在子类内部也不能访问

 

有继承关系下的属性查找顺序:
1.优先找自身,自身没有找父类
2.父类没有找父类的父类
3.一直找到最顶级的父类,如果还没有报错

两个名词:
先写子类,抽离 出父类
先写父类,派生 出子类

class Sup:
    num = 10

    def test(self):
        print('test sup')

class Sub(Sup):
    num = 100

    # 先写好父类的方法,由于父类方法的功能不满足子类需求,
    # 子类可以重写父类方法:方法名与父类相同,自定义方法的实现体
    def test(self):
        print('test sub')

print(Sub.num)
Sub().test()

 

class Sub(Sup):
    pass
    # 重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
    # 突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
    def test(self):
        # Sup().test()

        # python2中写法
        # super(Sub, self).test()
        # python3中简化写法
        super().test()

        print('>>>sub', self)
        print('test sub')


Sub().test()

 __init__结合super

人类:只需要初始化 - name 老师: 要初始化 - name salary 学生: 要初始化 - name grade
class Sup:
    def test(self):
        print(self)

    def __init__(self, name):
        self.name = name

class Sub(Sup):
    # 有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
    def test(self, num):
        super().test()
        print(num)

 

默认父级的__init__可以被继承过来, 但是会出现子类对象的属性比父类多
    def __init__(self, name, salary):
        super().__init__(name)  # 父级有的共性功能通过super()交给父级做
        self.salary = salary  # 子类特有的自己来完成

 

 Sub().test(10) Sub().test()  # 使用还是使用自身带参的,不能使用父级不带参的 (本质名字相同就是一个,优先查找自己的)多继承
简单的多继承''' 属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
class A:
    name = 'A'
    num = 10

class B:
    name = 'B'
    count = 100

 

子类可以继承所有父类的所有可继承属性
class C(A, B):  # 自己 => A => B
    # name = 'C'
    pass

print(C.num)
print(C.count)
print(C.name)
# 打印属性查找的顺序
print(C.mro())

 

复杂的多继承
class A:
    name = "A"
class B(A):
    name = "B"
class C:
    name = "C"
class D(C):
    name = "D"
class E(B, D):
    name = "E"
print(E.mro())

 


 -- 经典类:py2中类不默认继承object,所以没有明确继承的类就没有继承任何类,这样的类称之为经典类
-- 新式类:所有直接或间接继承object的类,py2中主动继承object的类及py3中所有的类

 
class G: name = "G"
class C(G): pass
class B(C): pass
class E(G): pass
class D(E): name = "D"
class F(G): pass
class A(B, D, F): pass
print(A.mro())

 派生

# 派生:继承父类属性的同时增加新的属性,然后使用super.__init__()# 引出方法二,方法二相当于对方法一进行了一层封装# 方法二:继承才可以使用
class People(XingXing):
    def __init__(self, name, age, height, weight, gender):
        super().__init__(height, weight, gender)  # 别人规定的语法
        self.name = name
        self.age = age

    def read(self):
        print('read')

    def jiao(self):
        print('jiao')


peo = People('nick', 18, 180, 140, 'male')  # 实例化的时候自动调用__init__
print(peo.__dict__)

print('*' * 50)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!