L-Jason

do sth you need, then do sth you want 。。。

面向对象三大特性之多态

面向对象三大特性之多态

  • 什么是多态

    不同对象响应同一种方法的表现出不同的行为,产生不同的结果

    用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以 在不用考虑对象具体类型的前提下而直接使用对象下的方法

  • 为什么要有多态

    1. 增加了程序的灵活性

      以不变应万变,不论对象千变万化,使用者都是以同一种形式去调用,如func(animal)

    2. 提高程序的拓展性

      通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用  

  • 怎么用多态

    让几个不同的类拥有相同的父类,继承了相同的方法,然后重新定义其方法,这样用相同的方法就能产生不同的结果.

class Animal:
    def eat(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()
​
​
# 调用不同对象的同一方法,产生不同结果(多态性的体现)
peo.talk()
dog.talk()
pig.talk()
​
​
def func(animal):  # 可以进一步封装成一个接口,传入什么对象就调用它的方法
    animal.eat()
​
​
func(pig)
​
  • abc模块

    abstract的缩写 ,抽象的意思

    • 使用ABC模块的步骤

      1. 为类中指定元类为metaclass = abc.ABCMeta

      2. 在相应的方法上加上@abc.abstractmethod

    import abc
    class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
        @abc.abstractmethod
        def talk(self):
            passclass People(Animal): #动物的形态之一:人
        def talk(self):
            print('say hello')
    ​
    class Dog(Animal): #动物的形态之二:狗
        def talk(self):
            print('say wangwang')
    ​
    class Pig(Animal): #动物的形态之三:猪
        def talk(self):
            print('say aoao')
            
            
    # 使用ABC装饰器的目的,将基类变为抽象基类,严格要求子类对象必须使用基类中被装饰的的方法,如果子类中没有该方法则报错.

     

  • 鸭子类型

    • 在现实中一个物体叫声象鸭子,走路也像鸭子,那么人们就把它当做鸭子

    • 对应到编程中就是两个独立的类,没有任何关联,但是两者的方法和 属性都一致(长得像),那么两者就可以实现多态(不同对象响应同一种方法的表现出不同的行为,产生不同的结果).这就是鸭子类型.

# 类Foo和Bar都拥有两种相同的方法,故两者称之为鸭子类型
class Foo:
    def f1(self):
        print('from foo.f1')
​
    def f2(self):
        print('from foo.f2')
​
​
class Bar:
    def f1(self):
        print('from bar.f1')
​
    def f2(self):
        print('from bar.f2')
​
​
obj1 = Foo()
obj2 = Bar()
​
# (obj1,obj2)不同对象针对同一方法(f1)产生不同的结果
obj1.f1()
obj2.f1()
#  (obj1,obj2)不同对象针对同一方法(f2)产生不同的结果
obj1.f2()
obj2.f2()

 

 

posted @ 2018-12-18 17:13  L-Jason  阅读(143)  评论(0编辑  收藏  举报