博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向对象三大特性之多态
阅读量:5846 次
发布时间:2019-06-18

本文共 1819 字,大约阅读时间需要 6 分钟。

面向对象三大特性之多态

  • 什么是多态

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

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

  • 为什么要有多态

    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 abcclass Animal(metaclass=abc.ABCMeta): #同一类事物:动物    @abc.abstractmethod    def talk(self):        pass​class 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()

 

 

转载于:https://www.cnblogs.com/liusijun113/p/10138467.html

你可能感兴趣的文章
Java基础学习总结(12)——一哈希编码HashCode
查看>>
CentOS7手动安装OpenStack Pike版--(horizon)
查看>>
Swiper 简单实例
查看>>
BZOJ1503[NOI2004]郁闷的出纳员——treap
查看>>
黑盒测试
查看>>
栈区,堆区,全局区,文字常量区,程序代码区 详解
查看>>
LAMP平台搭建
查看>>
PNG文件格式
查看>>
RIS铁面无私?
查看>>
网路协议与TCP协议ESP8266
查看>>
LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法)
查看>>
Effective C++: BitField
查看>>
拖延症(上)
查看>>
PHP开发微信平台红包api
查看>>
iScroll的用法
查看>>
JavaScript 类型总览
查看>>
易宝典文章——玩转Office 365中的Exchange Online服务 之十八 怎样利用设备邮箱合理分配利用企业设备资源...
查看>>
RAC学习资料
查看>>
cell smart table scan等待事件
查看>>
Entity Framework 通过T获取ObjectSet<TEntity>
查看>>