继承
单继承
- 继承的语法
子类继承自父类,可以直接获得父类中的方法和属性
#创建爷爷类
class grandF(object):
def __init__(self):
print("grandF被调用!")
self.name = "grandfather"
def test(self):
print("test:",self.name)
#创建父亲类
class father(grandF):
def __init__(self):
print("father is here now!")
self.name = "father"
print("创建爷爷类:")
g = grandF()
g.test()
>>> 创建爷爷类:
>>> grandF被调用!
>>> test: grandfather
print("创建父亲类:")
f = father()
f.test()
>>> 创建父亲类:
>>> father is here now!
>>> test: father
注:父亲类并没有创建test类,其继承自爷爷类
- 方法重写
重写有两种情况:- 子类覆盖父类方法
- 子类扩展父类方法
现在定义mother类,继承自grandF,但重写test方法
class mother(grandF):
def __init__(self):
super(mother,self).__init__()
self.name = "mother"
def test(self):
print("I am ",self.name)
# 创建mother
m = mother()
m.test()
>>> grandF被调用!
>>> I am mother
注:
- mother扩展grandF的__init__方法,所以初始化时会输出“grandF被调用!”
- mother重写test方法,所以会输出“I am mother"
多继承
如果子类继承多个父类,而父类中存在多个同名方法,那是调用哪一个父类的方法?
class son(father,mother):
def __init__(self):
self.name = "son"
s = son()
s.test()
>>> I am son
输出结果是mother类的test方式,为什么呀?
先看一下三个类的类图之间的关系:
调用mro魔法方法查看son父类的调用路径:
son.__mro__
>>> (__main__.son, __main__.father, __main__.mother, __main__.grandF, object)
- 从左到右顺序查找
- 找到对应方法时立即调用并执行,退出搜索
- 没有找到则继续查找下一个类,直到找到为止
- 如果最后没有找到,引起AttributeError
注:python3使用新式类,类搜索采用广度优先算法,旧式类采用深度优先算法,所以搜索结果不一样。
多态
- 将特有属性封装,通过继承重写完成不同的行为。
- 例:
- 父类人类行为:衣食住行
- 子类医生行为:衣食住行+看病
- 子类警察行为:衣食住行+抓小偷
- 医生与警察同属一个类人,但有不同的行为表现,这就是多态
类
创建对象时,分两步走:
- 内存为对象分配空间
- 调用初始化方法初始化对象
创建对象后:
- 通过 self. 来调用方法或者属性
来源:CSDN
作者:clchenLOu
链接:https://blog.csdn.net/weixin_40632135/article/details/103604599