类的继承与多态
1.继承
在面向对象程序设计中,用户可以先定义一个父类,通过父类用继承的方式来定义新类。新类就是子类,子类可以直接使用父类中的定义的属性和方法。通过继承方式可以很大的提高代码复用率。
1)单一继承
当一个子类继承父类只有一个时,称为单一继承。
语法格式:
class ChildClassName(FatherClassName):
<语句1>
...
<语句n>
在继承结构中,父类的名称要写在括号中。
由于继承机制,子类可以使用父类中任何 公有 的属性和方法,因此,对一个子类来说,它的属性包括自定义属性和继承两部分,而它的方法也包括自定义和属性两部分。
例题:编写一个父类A,通过继承方式得到子类B,在子类中使用父类的方法:
class Fclass:
def talk(self):
print("people can talk.")
def read(self):
print('people can read.')
class CClass(Fclass):
def eat(self):
print("people can eat.")
t=CClass()
t.talk()
t.read()
t.talk()
运行结果:
2)多重继承
Python中不仅支持单一继承,还支撑多重继承。所谓多重继承,也叫多继承,指的是一个子类继承多个父类。
多继承的语法格式:
class ChildClassName(FatherClass1,...,FatherClassn):
<语句1>
...
<语句2>
编写一个CClass,同时继承FClassA和FClassB,并在子类中调用父类方法。
class FclassA:
def talk(self):
print("people can talk.")
def read(self):
print('people can read.')
class FclassB:
def write(self):
print('peole can write')
class CClass(FclassA,FclassB):
def eat(self):
print("people can eat.")
t=CClass()
t.write()
t.talk()
t.read()
t.talk()
运行结果:
2.多态
多态是指方法的多态性,具体而言就是功能不同的方法使用同样的名称。多态的应用场景有两种,一类是类之间没有继承关系的多态,另一类是类之间有继承关系的多态。
1)无继承多态
如果彼此之间没有继承关系的类中,有方法名称重复,则出现了无继承关系的多态。不同类方法中,方法名名称相同,则需要在调用方法时给出不同的参数对象,而达到不同的实现功能。
解决不同类中方法调用的方式是,先定义一个同名方法,用该方法关联到不同类中,即将类名称作为一个方法的参数。
def <方法名称>(self,cls):
cls.<方法名称>([参数列表])
然后对该方法进行调用,调用方法如下:
<方法名称>(<类名称()>)
定义多个类,类之间咩有继承关系,但是在不同类中都有同样的方法run(),并使用多态技术合理调用方法。
class Bird():
def move(self):
print("Bird can fly in the sky")
class Fish:
def move(self):
print("Fish can move in sea")
class Horse:
def move(self):
print("horse move in land")
class Animal:
def move(self, cls): #第二个参数cls用来关联类名称,将指定的类作为参数传给move()方法
cls.move() #系统根据指定的类名称,决定调用指定类的同名方法。
t=Animal()
t.move(Bird())
t.move(Fish())
t.move(Horse())
2.有继承的多态
在有继承的情况下,如果父类和子类有同名方法,则相当于在子类中将父类的方法重写。此时用户调用子类实例就是子类方法。
对于方法构造而言,如果父类有构造方法,而子类没有构造方法,那么在定义子类实例时会自动执行父类的调用方法;如果子类有自己的构造方法,则在定义子类实例时,执行子类的构造方法。
在子类的构造方法中执行父类的构造方法:
super().__init__():
子这里需要注意的是调用父类的构造方法时,需要用到super()的前缀,表示当前类的父类,并且调用的位置是子类的构造方法内部。