一、继承简介
1.有一个类,能够实现我们需要的大部分功能,但是不能实现全部的功能,如何能让这个类来实现全部的功能?
①直接修改这个类,在这个类中添加我们需要的功能;
但是修改起来比较麻烦,会违反ocp原则
②直接创建一个新的类
但是创建一个新的比较麻烦,需要大量的复制粘贴,会出现大量的重复性代码
③直接从animal类中继承它的属性和方法
2.什么是继承?
--继承是面向对象的三大特性之一
--通过继承我们可以使一个类获取到其它类中的属性和方法
--在定义类的时候,可在类名后的括号中指定当前类的父类(超类、基类、super)
子类(衍生类)可以直接继承父类中的所有属性和方法。
通过继承可以直接让子类获取到父类的方法或属性,避免编写重复性的代码,并且也符合ocp原则,所以我们经常需要通过继承来对一个类进行扩展。
注意:在创建类的时候,如果省略了父类,则默认父类为object。所有的类都是object的子类。
图示#继承
#定义一个Animal的类
#这个类中2个方法
class Animal:
def run(self):
print('动物会跑~~~~ ')
def sleep(self):
print('动物睡觉~~~~')
#定义一个Dog类
class Dog(Animal):
def bark(self):
print('汪汪汪---')
#d既是dog的实例也是animal的实例
d = Dog()
#issubclass()检查一个类是否是另一个类的子类
print(issubclass(Dog,Animal))
#isinstance()用来检查一个对象是否是一个类的实例
#如果这个类是这个对象的父类,也会返回True
#所有的类都是object的子类
print(isinstance(Animal,object))
二、方法的重写
--如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们叫做方法的重写(覆盖,override)
图示class Animal:
def run(self):
print('动物会跑~~~~ ')
def sleep(self):
print('动物睡觉~~~~')
#定义一个Dog类
class Dog(Animal):
def bark(self):
print('汪汪汪---')
def run(self):
print('狗狗会跑@@@@')
#创建dog类的实例
d=Dog()
d.run()
注意:当我们调用一个对象的方法时,会优先去当前对象中寻找是否具有该方法,如果有则直接调用;如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法,如果没有,则去父类的父类中寻找,以此类推,直到找到object,如果object也没有,则报错。
三、super
父类中的所有方法都会被子类继承,包括特殊方法,也可以重写特殊方法。
图示class Animal:
#特殊方法init
def __init__(self,name):
self.__name = name
#设置name的getter和setter方法
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
self.__name = name
def run(self):
print('动物会跑~~~~ ')
def sleep(self):
print('动物睡觉~~~~')
#定义一个Dog类
class Dog(Animal):
#重写特殊方法init
def __init__(self,name,age):
self.__name = name
self.__age = age
#设置age的getter和setter方法,name已经在父类中设置过了
@property
def age(self):
return self.__age
@age.setter
def age(self):
self.__age = age
def bark(self):
print('汪汪汪---')
def run(self):
print('狗狗会跑@@@@')
#创建dog类的实例
d=Dog('常狗',26)
d.name ='小黑'
print(d.name)
print(d.age)
虽然子类可以重写父类的特殊方法,但是将父类的全部方法写入,会有些麻烦。
super()可以用来获取当前类的父类,并且通过super()返回对象调用父类方法时候,不需要传递self。
图示四、多重继承
__类名.__bases这个属性可以用来获取当前类的所有父类
class A(object):
def test(self):
print('AAAAA')
class B(A):
def test(self):
print('BBBBB')
class C(B):
def test(self):
pass
print(C.__base__)#输出(<class '__main__.B'>,)
在python中支持多重继承的,也就是一个类可以同时指定多个父类
--可在类名的()后边添加多个类,来实现多重继承
--多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
注意:在开发中没有特殊情况,应该避免多重继承,因为多重继承会让我们的代码过于复杂。如果多个父类中有同名的方法,则会先在第一个父类中去寻找,然后找第二个第三个。前边的会覆盖后面的。
图示class A(object):
def test(self):
print('AAAAA')
class B(object):
def test2(self):
print('BBBBB')
class C(A,B):
pass
print(C.__base__)#输出(,)
c = C()
c.test()
c.test2()
网友评论