什么是继承
继承是一种创建新类的方式,新建的类可以继承一个或多个父类(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)