007---多态与多态性

多态与多态性

多态

  • 多态:一种事物的多种形态,比如:动物有多种形态,人、狗、猫。
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))
posted @ 2019-01-25 19:26  爬呀爬Xjm  阅读(154)  评论(0编辑  收藏  举报