继承机制及父类方法重写
1 继承
1 谈谈什么是继承吧,继承是面向对象的三大特性之一,继承在面向对象第一节也提过,就是一个类里面的属性和方法可以被继承他的类所用
2 继承的作用是什么呢?
1.提高了代码的复用性
2.让类与类之间产生了关系,有了这个关系,才有了多态
下面举一个例子,让你更好的了解继承的作用
创建一个人的类
class Person:
# 定义一些人的属性
name = ''
age = ''
phone = ''
girl_friend = ''
father = ''
# 定义人的功能
def eat(self):
print("我会吃饭")
假如说你想创建一个人,他的属性有很多,方法也有很多,包括上面的那些,
你可以选择重新输入上面的属性和方法,也可以复制粘贴,可是假如上面的有一万行呢,操作起来相当麻烦,以后维护起来更加麻烦,所以就有了继承
下面就开始直接介绍继承吧
class Person():
# 定义一些人的属性
name = ''
age = ''
phone = ''
girl_friend = ''
father = '爸爸'
# 定义人的功能
def eat(self):
print("我会吃饭")
下面创建一个另外的人,使他继承上面人类的属性与方法
3 在定义类时,可以在类名后面加上括号,括号内中指定的是当前类的父类(超类、基类、super)
4 如果在创建类的时候省略了父类,则默认父类是object
5 在这里说明一下,object是所有类的父类,所有类都继承object
class Person(object):
class Person1(Person): # Person为Person1的父类
mather = '' # 创建新的属性
def run(self): # 创建新的方法
print("我会跑步")
# 显然新定义的类没有Person类中的属性
a = Person1()
print(a.father)
a.eat()
a.run()
运行结果
# 爸爸
# 我会吃饭
# 我会跑步
# 上面结果说明实例a 中明显有Person的属性和方法,这就说明Person1继承了Person
r = isinstance(a,Person) # 检测一个对象是否为一个对象的实例
print(r)
# True
r = isinstance(a,Person1) # 检测r是否为Person的实例
print(r)
# True
# issubclass(子类,父类) # 检查一个类是不是另一个类的子类
b = issubclass(Person1 ,Person)
print(b)
# True
b= issubclass(a,Person)
# TypeError: issubclass() arg 1 must be a class
# 也就是说必须是类与类之间的判断
总结一下继承后调用方法的步骤
1 当我们去调用一个对象的时候会优先去当前对象寻找是否就有该方法,如果有直接调用
2 如果没有,则去当前对象的父类中去寻找,如果有直接调用父类中的方法
3 如果没有, 则去父类中的父类寻找,如果有直接调用,以此类推,指导找到object,如果依然没有就报错
2方法的重写
1 如果在子类中有和父类重名的方法,通过子类的实例去调用方法时,
会调用子类的方法而不是父类的方法,这个特点称之为方法的重写(覆盖 override)
下面举例详细说明一下父类方法重写的应用
class Bird():
def fly(self):
print('我有翅膀,我会飞')
class Duck(Bird): # 继承Bird
def fly(self):
print('我是鸭子,我不会飞')
a = Duck()
a.fly()
# 我是鸭子,我不会飞
3多重继承
1 语法: 类名.bases 可以用来获取当前类的所有父类
2 在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
3 在开发中没有特殊情况,尽量避免使用多重继承,因为多重继承会让我们代码过于复杂
4 如果多个父类中有同名的方法,则会在第一个父类中寻找,然后找第二个…
前边会覆盖后面的
下面举例具体介绍一下
class Bird():
def fly(self):
print('我有翅膀,我会飞')
class Duck():
def fly(self):
print('我是鸭子,我不会飞')
class Animal(Bird,Duck):
pass
a = Animal()
a.fly() # Bird 在前面所以执行的是 Bird 的fly()方法
# 我有翅膀,我会飞
class Animal(Duck,Bird): # Duck 和 Bird类的顺序调换
pass
a = Animal()
a.fly() # Duck 在前面所以执行的是 Duck 的fly()方法
# 我是鸭子,我不会飞
print(Animal.__bases__)
# (<class '__main__.Duck'>, <class '__main__.Bird'>)