继承与多态

半世苍凉 提交于 2019-12-18 21:29:15

继承

单继承

  1. 继承的语法
    子类继承自父类,可以直接获得父类中的方法和属性
#创建爷爷类
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类,其继承自爷爷类

  1. 方法重写
    重写有两种情况:
    • 子类覆盖父类方法
    • 子类扩展父类方法

现在定义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方式,为什么呀?
先看一下三个类的类图之间的关系:
Alt

调用mro魔法方法查看son父类的调用路径:

son.__mro__
>>> (__main__.son, __main__.father, __main__.mother, __main__.grandF, object)
  • 从左到右顺序查找
  • 找到对应方法时立即调用并执行,退出搜索
  • 没有找到则继续查找下一个类,直到找到为止
  • 如果最后没有找到,引起AttributeError

注:python3使用新式类,类搜索采用广度优先算法,旧式类采用深度优先算法,所以搜索结果不一样。

多态

  • 将特有属性封装,通过继承重写完成不同的行为。
  • 例:
    • 父类人类行为:衣食住行
    • 子类医生行为:衣食住行+看病
    • 子类警察行为:衣食住行+抓小偷
    • 医生与警察同属一个类人,但有不同的行为表现,这就是多态

创建对象时,分两步走:

  • 内存为对象分配空间
  • 调用初始化方法初始化对象

创建对象后:

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