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