多态
面向对象三大特征及作用:
- 封装:确保对象中的数据安全
- 继承:保证了对象的可扩展性
- 多态:保证了程序的灵活性
多态我自己简单总结一句话:使用方法(或者其他…)时,不用考虑对象类型,适用性强,比如常见的len( )
# 多态
# 狗(哈士奇,泰迪,金毛。。)
# 一个对象可以以不同的形态去呈现
class A :
def __init__ (self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class B :
def __init__ (self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
a = A('小王')
b = B('老刘')
# 对于say_hello( )函数来说,只要对象中含有name属性,他就可以作为参数传递
# 这个函数并不会考虑对象的类型,只要有name属性即可
# 典型多态:
def say_hello (obj):
print('你好 %s'%obj.name)
say_hello(a)
say_hello(b)
# say_hello_2( )做了类型检查,违反了多态的函数,只适用于一种类型的对象,
# 无法处理其他类型的对象,导致函数的适应性非常差
# 注意:像isinstance( )这种使用了会违反多态的函数,开发中一般不会使用
def say_hello_2 (obj):
if isinstance(obj,A) :
print('你好 %s'%obj.name)
# 多态典型:
# 鸭子例子
# 如果一个东西,走路像鸭子,叫声像鸭子,那么他就是鸭子
# len( )
# 之所以一个对象能通过len( )获取长度,是因为对象有一个特殊方法__len__
# 只要对象中有__len__特殊方法,就能够通过len( )来获取它的长度
l = [1,2,3]
s = 'hello'
print(len(l))
print(len(s))