继承与派生
Posted legend27
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承与派生相关的知识,希望对你有一定的参考价值。
什么是继承
继承是一种创建新类的方式,新建的类可以继承一个或多个父类(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)
以上是关于继承与派生的主要内容,如果未能解决你的问题,请参考以下文章