12.5 多态与多态性
- 多态:一种事物有多种形态,只要大家都能继承A,那么这些东西就是A的多态
- 水:固态/液态/气态
- 动物:人/狗/猫
class Animal:
def __init__(self,height,weight):
self.height=height
self.weight=weight
class People(Animal):
def speak(self):
print('speak')
peo=People(185,140)
class Dog(Animal):
def bark(self):
print('wangwangwang!')
dog=Dog(50,100)
class Cow(Animal):
def mou(self):
print('mowmow')
cow=Cow(100,200)
peo.speak()
dog.bark()
cow.mou()
#这样很麻烦,引入多态
speak
wangwangwang!
mowmow
import abc
class Animal(metaclass=abc.ABCMeta):
def __init__(self, name, height, weight):
self.height = height
self.weight = weight
self.name = name
@abc.abstractmethod # 加装饰器, 固定必须写speak、eat ,不推荐使用 。
def speak(self):
print(self.name, '叫')
@abc.abstractmethod
def eat(self):
print(self.name, '吃')
class People(Animal):
def speak(self):
print('speak')
def eat(self):
print(self.name, '吃饭')
class Dog(Animal):
def speak(self):
print('wangwangwang!')
def eat(self):
print(self.name,'吃狗粮')
class Cow(Animal):
def speak(self):
print('mowmow')
def eat(self):
print(self.name,'吃草')
def eat1():
pass
peo = People('peo', 185, 140)
dog = Dog('dog', 50, 100)
cow = Cow('cow', 100, 200)
peo.speak()
dog.speak()
cow.speak()
peo.eat()
dog.eat()
cow.eat()
speak
wangwangwang!
mowmow
peo 吃饭
dog 吃狗粮
cow 吃草
- 鸭子类型,叫声像鸭子,长相像鸭子,就是鸭子,只要有speak和eat这两个方法那就是动物类
- 对于这个例子,只要有speak方法/有eat方法,无论怎么定义这个类都是动物的一种形态
def func(obj):
#多态性的使用,提供接口
#接口就是函数
obj.eat()
# obj.sleep()
# obj.walk()
func(dog) #传入不同的对象,同一种技能有不同的表现形式。
func(cow)
dog 吃狗粮
cow 吃草