十九 继承和多态
三大特性:封装、继承、多态
19.1 继承
继承:面向对象的特性之一,通过继承可以让 子类去获得其他类中的属性和方法
# 如何继承?
class 子类名(父类名称)
class Animal:
def sleep(self):
print("休息一会儿。。。")
def eat(self):
print("吃一会儿东西。。。")
class Dog(Animal):
def run(self):
print('狗在奔驰')
d = Dog()
d.eat()
d.sleep()
d.run()
Animal是Dog : 父类
Dog是Animal : 子类
子类可以直接继承父类中已有的属性和方法
意义:可以避免写重复性的代码
- 内置函数
isinstance(a,b) 判断a对象是不是b类型,包括b的父类
第一个参数: 对象
第二个参数: 类名
print(isinstance(d, Dog)) # d是通过Dog创建的对象
print(isinstance(d, Animal)) # d是通过Dog创建的对象
print(isinstance(d, object)) # True
object -> 外号:超类 superclass
存在即合理 object
所有的__开头的魔法方法,都是object给的
19.2 方法重写
class Animal: # 等价于 class Animal(object):
def sleep(self):
print("休息一会儿。。。")
def eat(self):
print("吃一会儿东西。。。")
class Dog(Animal):
def eat(self):
print("啃骨头")
d = Dog()
d.eat()
当子类实现了父类已经存在的 方法名,会优先执行自己方法
- 先看自己,再看父类,最后找object
19.3 super
一个内置函数 super() ,可以帮助我们在子类的方法重写中,去调用会被覆盖的父类方法。特别是在 init中经常用
super() 在子类中返回自己的父类,可以直接理解为父类。
class Animal: # 等价于 class Animal(object):
def __init__(self,name):
self.name = name
def sleep(self):
print("休息一会儿。。。")
def eat(self):
print("吃一会儿东西。。。")
class Dog(Animal):
# 也能够直接继承父类的 init中属性定义
def __init__(self,name,age):
super().__init__(name) # Animal.__init__(name) 调用父类的init
self.age = age #
def eat(self):
print("啃骨头")
d = Dog("小哈",12)
print(d.name)
print(d.age)
19.4 多重继承
类—>类–>类–>类
类名.__bases__ 输出自己的父类
class A:
pass
class B(A):
pass
class C(B):
pass
class D(A):
pass
19.5 多继承
python 多继承
java和C++ 没有多继承,多重继承
class A:
def A(self):
print('我是A')
class B:
def B(self):
print('我是B')
class C(B,A):
def C(self):
print('我是C')
c = C()
如果多继承用复杂了,怎么去查看 方法的搜索路径?
class A():
def run(self):
print('我是A')
class B():
def run(self):
print('我是B')
class C(A,B):
def C(self):
print('我是C')
# mro方法,会将方法的搜索路径返回
print(C.mro())
多态的核心思想:多态性允许我们在不考虑对象具体类型的情况下,使用统一的接口或方法来操作不同类型的对象
多态允许统一的接口(speak方法)允许不同类型的对象在相同的操作下表现出不同的行为
19.6 多态
多态:对象的不同形态
狗
- 哈士奇
- 金毛
- 中华田园犬
- ...
多态:鸭子类型 : 如果有一个东西走路像鸭子,叫声像鸭子,那么就是鸭子
len() # 作用获取对象的长度
lis = [3,4]
s = "hello world"
class Dog:
def __len__(self):
return 100
d = Dog()
# len 只关心 对象有没有 __len__()
print(len(d))
三大特性总结
-
封装
- 将属性藏起来,只对外界暴露必要的属性,不必要可以自己去控制
-
继承
- 允许一个类从另一个类继承属性和方法,从而实现代码的复用和拓展
-
多态
- 允许使用统一的接口来操作不同的对象,从而使得代码更加灵活和可扩展