今天开始说面向对象的最后一个特性多态。
多态从字面意思上看就是多种形态,比如人有黑种人,黄种人,白种人等等,这就是一类事物的不同形态,在我们python的面向对象里就是不同的对象在接收相同方法或者函数时会产生不同的行为,也就是说,每个对象可以用自己的方式去响应共同的函数,不同的方式实现不同的结果
Python学习群:683380553,有大牛答疑,有资源共享!有想学习python编程的,或是转行,或是大学生,还有工作中想提升自己能力的,正在学习的小伙伴欢迎加入学习。
多态的使用一般是和类的继承绑定在一起,实现一类事物中的不同形态
下面我们看看代码中具体怎么实现
class Person:
def init(self,name,area,type):
self.name=name
self.area=area
self.type=type
def go_home(self):
if self.type == '黄种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '黑种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '白种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '蓝种人':
print('%s要回%s' %(self.name,self.area))
else:
print('不知道家在哪里')
class Melanoderm(Person):
pass
class Yellow(Person):
pass
class White(Person):
pass
定义不同的对象
M=Melanoderm('Rose','非洲','黑种人')
Y=Yellow('Alert','美国','白种人')
W=White('小明','中国','黄种人')
不同对象实现相同的函数方法,达到不同的结果
def func(obj):
obj.go_home()
func(M)
func(Y)
func(W)
结果
Rose要回非洲
Alert要回美国
小明要回中国
这个案例就对应了多态,不同的对象在接收相同方法或者函数时会产生不同的行为。
多态的使用是建立在类继承的基础之上的,而且要在对象执行函数的时候才能体现出多态的特性。看上面的例子,在对象执行函数的时候,我们才能知道各个人回什么国家。
那说到这里大家可能想知道,那为什么要使用多态呢?大概有下面2条
1.增加了程序的灵活性, 以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)
2.增加了程序额可扩展性,通过继承Person类创建了一个新的类,使用者无需更改自己的代码,还是用func(obj)去调用
下面我们增加一种形态,蓝种人(蓝血人是真实存在的哦,不是我瞎编的,只是人数很少,不为外人所知,有兴趣的可以查下),看看我们队代码的改变
class Person:
def init(self,name,area,type):
self.name=name
self.area=area
self.type=type
def go_home(self):
if self.type == '黄种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '黑种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '白种人':
print('%s要回%s' %(self.name,self.area))
elif self.type == '蓝种人':
print('%s要回%s' %(self.name,self.area))
else:
print('不知道家在哪里')
class Melanoderm(Person):
pass
class Yellow(Person):
pass
class White(Person):
pass
class Blue(Person): #增加一种形态的人种
pass
定义不同的对象
M=Melanoderm('Rose','非洲','黑种人')
Y=Yellow('Alert','美国','白种人')
W=White('小明','中国','黄种人')
增加一类对象
B=Blue('Caorl','某海岛','蓝种人')
不同对象实现相同的函数方法
def func(obj):
obj.go_home()
func(M)
func(Y)
func(W)
使用者调用方式不变
func(B)
结果
Rose要回非洲
Alert要回美国
小明要回中国
Caorl要回某海岛
我看根据上面的代码可知,当我们增加一种形态时候,完全不影响外部用户的调用方式,对使用者是透明的。只要我们自己在内部修改类代码实现即可。
网友评论