继承:
- 定义一个类Animal(动物),这个类中需要两个方法:run() sleep()
class Animal:
def run(self):
print('动物会跑')
def sleep(self):
print('动物睡觉')
- 定义一个类Dog(狗)
class Dog:
def run(self):
print('狗会跑')
def sleep(self):
print('狗睡觉')
def bark(self):
print('汪汪汪')
这个类中需要三个方法:run() sleep() bark()
能够实现我们需要的大部分的功能,但是不能实现全部功能,如何能让这个类来实现全部的功能呢?
-
直接修改这个类,在这个类中添加我们需要的功能。修改起来会比较麻烦,并且会违反ocp原则
-
直接创建一个新的类。创建一个新的类比较麻烦,并且需要大量的复制粘贴,会出现大量的重复性代码。
-
直接从Animal类中来继承它的属性和方法。继承是面向对象三大特性之一。通过继承我们可以使一个类获取到其他类中的属性和方法。在定义类时,可以在类名后的括号中指定当前类的父类(超类,基类,super)
class Dog(Animal):
def bark(self):
print('汪汪汪')
默认父类为object
class Person(object):
pass
issubclass()检查一个类是否另一个类的子类
isinstance()用来检查一个对象是否是一个类的实例,如果这个类是这个对象的父类,也会返回True,所有的对象都是object的实例
完整例子
class Animal:
def run(self):
print('动物会跑')
def sleep(self):
print('动物会睡觉')
class Dog(Animal):
def bark(self):
print('汪汪汪...')
d = Dog()
d.run()
动物会跑
d.sleep()
动物会睡觉
d.bark()
汪汪汪...
isinstance(d,D)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'D' is not defined
isinstance(d,Dog)
True
isinstance(d,Animal)
True
issubclass(Animal,object)
True
issubclass(Dog,object)
True
方法重写:
定义:
- 如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类方法而不是父类方法,这个特点我们称为方法的重写(覆盖,override).
当我们调用一个对象的方法时:
会优先去当前对象中寻找是否具有该方法,如果有则直接调用;如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法;如果没有,则去父类中的父类去寻找,以此类推,直到找到object,如果依然没有找到,则报错。
完整例子
#依次从近到远查找函数
class A(object):
def test(self):
print('aaa')
class B(A):
pass
class C(B):
pass
c = C()
c.test()
aaa
#找到父类中的函数
class A(object):
def test(self):
print('aaa')
class B(A):
def test(self):
print('bbb')
class C(B):
pass
c = C()
c.test()
bbb
#调用当前对象中的函数
class A(object):
def test(self):
print('aaa')
class B(A):
def test(self):
print('bbb')
class C(B):
def test(self):
print('ccc')
c = C()
c.test()
ccc
super()
在子类中调用父类对象
class Animal():
def __init__(self,name):
self._name = name
def sleep(self):
print('动物睡觉')
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
#父类中所有的方法都会被子类继承,包括特殊方法,也可以重写特殊方法
class Dog(Animal):
def __init__(self,name,age):
#希望可以直接调用父类的__init__来初始化父类中定义的属性
#super()可以用来获取当前的父类
#并且通过super()返回对象调用父类方法时,不需要传递self
super().__init__(name)
self._age = age
def bark(self):
print('汪汪汪')
def run(self):
print('狗跑...')
@property
def age(self):
return self._age
@age.setter
def age(self,age):
self._age = age
d = Dog('小黑',2)
d.name
'小黑'
d.age
2
多重继承
定义
在python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类,可以在类名中的()后边添加多个类,来实现多重继承,多重继承,会使子类同时用由多个父类,并且会获取到所有父类中的方法,在开发中没有特殊的情况,应该尽量避免使用多种继承,因为多重继承会让我们的代码过于复杂,如果多个父类中有同名的方法,则会在第一个父类中寻找,父类的父类,然后第二个父类,父类的父类,然后第三个父类,前边父类的方法会覆盖后面的父类方法。
- 类命.__bases__这个属性可以用来获取当前类的所有父类。
完整例子
class A(object):
def test(self):
print('AAA')
class B(object):
def test2(self):
print('BBB')
class C(A,B):
pass
print(C.__base__)
<class '__main__.A'>
print(C.__bases__)
(<class '__main__.A'>, <class '__main__.B'>)
print(B.__bases__)
(<class 'object'>,)
c.test()
ccc
c = C()
c.test()
AAA
c.test2()
BBB
class A(object):
def test(self):
print('AAA')
class B(object):
def test(self):
print('BBB')
class C(A,B):
pass
c = C()
c.test()
AAA