简介
类的继承可以看成对类的属性和方法的重用,能够大大的减少代码量。这在项目开发中非常常见。本文将为大家介绍类的继承相关知识。
父类和子类
父类和子类的概念非常好理解,从遗传的观点来看,子类继承父类的所有属性和方法。并且,子类能够自定义更多的属性和方法,对原来的父类不会产生任何影响。这可以让程序员将更多的精力放在新功能的开发上面,而不用过多纠结从头开始编写功能。
单继承
所谓单继承,就是只有一个父类的继承方式,它的格式如下:
1 2 3 4 5 6 7 8 9 |
class A(): 属性 def 方法a(self, 参数): code blockA class B(A): 属性 def 方法b(self, 参数): code blockB |
我们在这里定义了两个类(A和B),此时A是父类,B是子类。在B的()
中放入A,表示B继承了A的属性和方法。并且,B类中定义了自己的方法b
,比如:
1 2 3 4 5 6 7 8 |
class A(): name = 'finthon' def speak(self): print('welcome') class B(A): def listen(self): print('I am listening') |
输入以下程序:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>>a1 = A() >>>a1.name 'finthon' >>>a1.speak() welcome >>>b1 = B() >>>b1.name 'finthon' >>>b1.speak() welcome >>>b1.listen() I am listening |
当子类B继承了父类A之后,子类B就拥有了父类A中的所有属性和方法,并且在子类B中,仍然可以拥有自己的方法。如果子类B中的属性和方法跟父类的属性和方法有重复怎么办?看下面的例子:
1 2 3 4 5 6 7 8 9 10 11 |
class A(): name = 'finthon' def speak(self): print('welcome') class B(A): name = 'python' def speak(self): print('hello') def listen(self): print('I am listening') |
子类B中也定义和父类A中相同名字的属性和方法,它的结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
>>>a1 = A() >>>a1.name 'finthon' >>>a1.speak() welcome >>>b1 = B() >>>b1.name #以子类中的属性和方法为准 'python' >>>b1.speak() hello >>>b1.listen() I am listening >>>a2 = A() #父类A中的属性和方法不会变 >>>a2.name 'finthon' >>>a2.speak() welcome |
可以看出,当子类B中的属性和方法与父类A中的属性和方法名字重复的时候,子类B就会将父类A中继承过来的同名属性和方法替换掉,以子类B中新定义的同名属性和方法为准。并且不会影响父类A中的同名属性和方法。
多继承
多继承就是继承了多个父类的属性和方法,它的格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class A(): 属性 def 方法a(self, 参数): code blockA class B(): 属性 def 方法b(self, 参数): code blockB class C(A, B): 属性 def 方法c(self, 参数): code blockC |
上面的代码表示类C继承了类A和类B 的属性和方法。此时类C为子类,类A和类B为父类。举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class A(): name = 'finthon' def speak(self): print('welcome') class B(): name = 'python' def speak(self): print('hello') def listen(self): print('I am listening') class C(A, B): name = 'class C' def write(self): print('I am writing') |
我们定义了三个类,其中C继承了A和B。实现以下程序:
1 2 3 4 5 6 7 8 9 |
>>>c1 = C() >>>c1.name 'class C' >>>c1.speak() welcome >>>c1.listen() I am listening >>>c1.write() I am writing |
需要注意的是,首先三个类中都有属性name
,最后对象c1
调用的是子类C的属性name
;当父类A和B中都有方法speak()
的时候,对象c1
调用的是优先继承的父类A中的speak()
方法,这点非常重要。上面的类C如果改成:
1 |
class C(B, A): |
那么结果为:
1 2 |
>>>c1.speak() hello |
此时就是先继承了父类B中的speak()
方法。
总结
我们详细地介绍了继承的概念,子类会继承父类所有的属性和方法,并且子类能够拥有自己的属性和方法;单继承中只有一个父类,而多继承中有多个父类;当子类的属性和方法与父类的属性和方法名称重复时,以子类的属性和方法为准;当继承的多个父类中都有相同名称的属性和方法时,会优先继承写在前面的父类的重名属性和方法。通过类的继承能够扩大项目的功能,在原有功能的基础上能够增加新的功能,并且不会对原有功能产生影响。