一.继承
1.什么是继承
- 继承就是为了解决两个有大量重复性代码的类。 抽象出一个更抽象的类放公共代码。
- 其意义是重用代码,方便代码的管理与修改
- 类的继承包括属性和方法
2.继承关系
- object — 顶级父类
- 若类没有任何继承,他的父类就是object
- 子承父业
class Father(object):
def __init__(self, name):
self.name = name
def fun(self):
print('父类中方法被调用')
class Son(Father):
# 当字类与父类拥有同名方法时,会重构此方法
def __init__(self, name):
self.name = 'son'
f = Father('父类')
s = Son('子类')
print(Father.__base__) # 查看Father的父类
print(Son.__bases__) # 查看Son的父类
s.fun() # 字类调用父类方法
print(s.name) # 与父类存在同名方法,重构方法
3.继承搜索
- 在上面我们可以看见,继承情况下, 访问类的属性以及方法时,其搜索顺序
- 访问类的属性以及方法 — 类 ---- 直接基类(父类) ---- 间接基类 (父类的父类)
二 .多继承
1.多继承首先需要明白继承时的顺序
class Base(object):
def __init__(self, name):
rint('Base类初始化函数被调用')
def fun(self):
print('Base类中fun方法被调用')
class A(Base):
def __init__(self):
print('Base子类A初始化方法被调用')
class B(Base):
def __init__(self):
print('Base子类B初始化方法被调用')
class C(A, B):
def __init__(self):
print('A,B的子类C初始化方法被调用')
test1 = C()
print(test1)
print(C.__bases__)
print(C.__mro__) # 查找顺序
# 继承优先前面,也就是先看A,然后看B,再看Base,最后看object
2.继承-重构
- 当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来进行覆盖
例如上图初始化方法
3.继承-重构延用
- 解决重构之后又需要调用
方法一:super() ----
-
super指定继承需要有继承关联
-
super(): 是用于调用父类的一个方法,遵循就近原则
-
super()是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
方法二:指定性(重点)
- 在继承范围内进行指定性调用
三.多继承中的私有性问题
- 私有属性可以被继承
- 私有属性不可被直接访问
- 可以通过父类方法返回值来得到父类的私有属性
四.多态
-
在不同类中定义不同功能的函数时使用相同的函数名,可以实现一个函数名调用多种功能
-
多态的特点
- 只需要对象的实例方法同名不需要对象所属的类型相同。
- 对象所属的类不一定要有继承关系。
- 多态可以增加代码的外部调用灵活度,增加代码通用性,提高兼容性。
- 多态是调用方法的技巧,在类做内部设计时不受影响。
1.对象所属类无继承关系时的多态
class Aircraft(object): # 飞机类
def move(self):
print('飞机move')
class Car(object): # 汽车类
def move(self):
print('汽车move')
class train(object):
def move(selfd):
print('火车move')
def move1(obj): # 实现移动的功能函数
obj.move()
air = Aircraft()
car = Car()
tra = train()
move1(tra)
tra.move()
2. 对象所属类有继承关系时的多态
class Animal(object):
def __init__(self):
pass
def eat(self):
print('进食')
class Dog(Animal):
def eat(self):
print('此时在Dog类中已重写父类的eat方法')
print('吃骨头')
class Cat(Animal):
def eat(self):
print('此时在Cat类中已重写父类的eat方法')
print('吃鱼')
def eat(obj):
obj.eat()
animal = Animal()
eat(animal) # Animal中的方法
dog = Dog()
eat(dog)
cat = Cat()
eat(cat)
3.对象信息
- 在python中判断对象类型,都是使用type()函数。
- 如果一个变量指向函数或者类也可以使用type(),但是type()返回函数类型是需要if语句取判断的。
- 对于class思维继承关系来说使用type很不方便,因此判断class的类型就要去使用isinstance()函数
- 此时cat没有继承animal,也不是animal类,故返回值为false
- 方便用于条件判断,来判断对象是否为某种类型