多态、多态性、鸭子类型

一.多态

1.1什么是多态

多种状态 形态
生活中具备多种形态的事物  水(水蒸气,冰,液态水)  奥特曼(红色 力量,蓝色 速度)  数码宝贝(究极形态)
一种事物 具备多种形态或状态 就称之为多态
官方解释:不同对象 可以相应同一方法,并作出不同的行为,产生不同结果

1.2如何使用多态

让几个不同类拥有相同父类,这样一来他们就具备了相同的方法,每个子类要覆盖父类的方法,从而每个类的对象行为都不同
class Animal:
    def eat(self):
        print("动物在吃东西...")
    def sleep(self):
        print("动物在睡觉...")
    def drink(self):
        print("动物需要水.....")

class Person(Animal):
    def eat(self):
        print("人吃粮食...")

class Pig(Animal):
    def eat(self):
        print("猪吃饲料...")

class Dog(Animal):
    def eat(self):
        print("狗吃骨头...")

person = Person()
pig = Pig()
dog = Dog()

person.eat()
pig.eat()
dog.eat()
#假设你学习了C1驾照  意味着 所有C1类的汽车都能开  因为每种C1汽车的驾驶方式相同

# 当使用了多态之后 对象的使用者不需要关系这个对象具体的实现,只需要知道该对象属于哪个基类,就能直接使用它
# 如此扩展性变高了

class Phone:
    def call(self):
        print("手机就能打电话..")

    def send_msg(self):
        print("手机能发短信..")

class WindowsPhone(Phone):
    def call(self):
        print("windows拨号打电话..")

    def send_msg(self):
        print("windows输入号码发短信..")

class IPhone(Phone):
    def call(self):
        print("IPHONE拨号打电话..")

    def send_msg(self):
        print("IPHONE输入号码发短信..")

# 可以定义一个方法接受一个手机为参数 无论是什么类型的手机 都可以被使用

def CALL(phone):
    phone.call()

wp = WindowsPhone()
ipx = IPhone()

CALL(wp)
CALL(ipx)

# 系统内置的方法有很多都体现了多态

print(len("abc"))
print(len([1,2,3,4,]))
print(len({"name":"123","sex":"man"}))

print("abc".__len__())
print([1,2,3,4,].__len__())
print({"name":"123","sex":"man"}.__len__())

print(len({1,23,4,5}))

二.多态之abc模块

2.1abc模块的作用

多态是多个类的对象拥有相同的方法,但是我们没有从严格要求说必须提供这些方法,子类完全可以不提供这些方法
# 现在要做的就是 严格要求 子类必须实现父类声明的方法
import abc
# abstract class 是抽象类的缩写   抽象的意思是 不清晰 不具体 看不懂

#使用ABC模块来限制子类 的步骤
#1.为类中指定元类为abc.ABCMeta
#2.在相应的方法上加上abc.abstractmethod装饰器

class Animal(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def eat(self):
        pass

    @abc.abstractmethod
    def drink(self):
        pass


class Cat(Animal):
    def eat(self):
        print("猫爱吃鱼肉...")

    def drink(self):
        print("用舌头舔..")

class Dog(Animal):
    def eat(self):
        print("狗爱吃骨头...")
    def drink(self):
        print("用舌头舔..")

class Pig(Animal):
    def eat(self):
        print("猪 爱吃草...")

    def drink(self):
        print("用嘴吸的..")

p = Pig()
# p.eat()

c = Cat()
# c.eat()

# 多态的好处 完全不需要考虑得到的对象时声明类型 只要知道了其基类中的内容就能使用
def feeding(animal):
    animal.eat()
    animal.drink()

feeding(c)
feeding(p)
# 多态中的基类 相当于(协议 标准 规范) 要求子类必须满足这些标准

三.鸭子类型

pass

posted @ 2018-12-28 20:55  王苗鲁  阅读(131)  评论(0编辑  收藏  举报