Python学习笔记(15)-继承、多态
继承
单继承
一个类A拥有一个类B的属性和方法,类A称作子类或派生类,类B称作父类或基类
示例:
class Animal(object): def __init__(self): self.color ="黑色" def run(self): print("---跑---") class Cat(Animal): pass tom = Cat() print(tom.color) tom.run()
运行结果:
黑色
---跑---
说明:
1、示例中我们称Cat类继承了Animal类,Cat类称为子类或派生类,Animal类称为父类或基类
2、子类在继承的时候,在定义类时,小括号()中为父类的名字,父类的属性和方法会继承给子类
3、示例中Animal没有继承其他类的时候默认继承object类,object类是所有类的基类
4、虽然子类Cat没有定义__init__、run
方法,但是父类Animal有,所以在子类继承父类的时候__init__、run方法就被继承了,所以在创建tom对象时,默认执行了那个继承过来的__init__、run
方法,所以执行结果输出了黑色、---跑---
注意:
父类中的私有属性、私有方法无法被继承
示例:
class Animal(object): def __init__(self): self.__color ="黑色" def __run(self): print("---跑---") class Cat(Animal): pass tom = Cat() print(tom.color) tom.run()
运行结果:
Traceback (most recent call last):
File "F:/untitled/Python_jichu/继承.py", line 9, in <module>
print(tom.color)
AttributeError: 'Cat' object has no attribute 'color'
多继承
子类拥有多个父类的继承关系称作多继承
示例:
class A(object): def __init__(self): self.color ="黑色" def run(self): print("---跑---") class B(object): def jump(self): print("---跳---") class C(A,B): pass c = C() print(c.color) c.run() c.jump()
运行结果:
黑色
---跑---
---跳---
说明:
子类在继承多个父类的时候,在定义类时,小括号()中为父类们的名字,中间用逗号隔开,父类们的属性和方法会继承给子类
当多个父类存在同名的方法名称时,匹配顺序为print(c.__mro__)输出的结果顺序
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
多态
定义功能时不知道这个功能调用的是哪一个方法,代码真正执行到调用时才根据传入的数据确定调用的是哪个方法
示例:
class A(object): def run(self): print("---跑1---") class B(object): def run(self): print("---跑2---") def test(temp): temp.run() a = A() b = B() test(b) test(a)
运行结果:
---跑2---
---跑1---
说明:
定义test函数时并不知道函数需要掉A中的run方法还是B中的run方法,当执行到test()时才根据传入的对象确定调用哪个类中的run方法