多态与多态性
多态
- 多态:一种事物的多种形态,比如:动物有多种形态,人、狗、猫。
import abc
class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物
@abc.abstractmethod
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass
class Person(Animal): # 动物形态之一:人
def run(self):
print('在走')
def eat(self):
print('人吃饭')
class Pig(Animal): # 动物形态之一:猪
def run(self):
print('在跑')
def eat(self):
print('猪吃草')
class Dog(Animal): # 动物形态之一:狗
def run(self):
print('在跳')
def eat(self):
print('小狗吃肉')
class Cat(Animal): # 动物形态之一:猫
def run(self):
pass
def eat(self):
pass
多态性
- python本身就是支持多态性的。不考虑实例对象的类型,比如说python的 + ,字符串能相加。数字能相加,列表能相加。但是他们是不同的对象;还有len()。字符串有长度。列表有。元祖有,字典等都有。
- 静态多态性、动态多态性。
- 不管对象是什么类型。只要他实现了某个方法就行。
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass
class Person(Animal):
def run(self):
print('在走')
def eat(self):
print('人吃饭')
class Pig(Animal):
def run(self):
print('在跑')
def eat(self):
print('猪吃草')
class Dog(Animal):
def run(self):
print('在跳')
def eat(self):
print('小狗吃肉')
class Cat(Animal):
def run(self):
pass
def eat(self):
pass
class Phone:
def eat(self):
print('我是手机对象,吃不得')
person1 = Person()
pig1 = Pig()
dog1 = Dog()
p = Phone()
# 统一的接口
def func(animal):
animal.eat()
func(person1)
func(pig1)
func(dog1)
func(p)
'''
人吃饭
猪吃草
小狗吃肉
我是手机对象,吃不得
'''
- 对于animal来说。它是func的一个参数,而却代表着多种形态,动物。人。猫。狗。手机。
- 为什么要使用多态性?
- 增加量程序的灵活性。以不变应万变,不论对象千变万变,使用者都是通过接口func(animal)去调用
- 增加量程序的可扩展性。新建的类Phone。只要他下面有eat方法,使用者可以完全不修改自己的代码,和动物类一样调用eat()方法。
鸭子类型
- 如果看起来像鸭子,走起来像鸭子,叫起来像鸭子,那它就是鸭子。
- 序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系
# 序列类型:列表list 元祖tuple 字符串str
l = list([1,2,3])
t = tuple(('a','b'))
s = str('hello python')
def len(obj):
return obj.__len__()
print(len(l))
print(len(t))
print(len(s))