Python面向对象04 /封装、多态、鸭子类型、类的约束、super

1. 封装

  • 把一堆东西(代码,数据)放到一个地方(空间),并且可以使用,比如:函数,类

2. 多态

  • 一个事物可以呈现多种形态 , 例如:水可以支持固态、液态、气态

  • Python默认支持多态(Java是强定义语言,Python是弱定义语言)

  • Python一个变量可以支持多种数据

  • 代码示例:

    1. python:
    2. a = [1,2,3]
    3. a = "abc"
    4. Java:
    5. int a = 123

3. 鸭子类型

  • Python崇尚鸭子类型(一种编程思路)

  • 看起来像鸭子就是鸭子类型

  • 将相似的功能,起同一名字,一种开发思路

  • 虽然A,B两个类没有关系,但是统一两个类中相似方法的方法名,在某种意义上是统一了一个标准

  • 优点:方便记忆,例如:str tuple list 都有 index方法,这就是统一了规范

  • 代码示例:

    1. class A:
    2. def login(self):
    3. print('登录')
    4. def register(self):
    5. print('注册')
    6. def func1(self):
    7. pass
    8. def func2(self):
    9. pass
    10. class B:
    11. def login(self):
    12. print('登录')
    13. def register(self):
    14. print('注册')
    15. def func3(self):
    16. pass
    17. # A B互为鸭子.

4. 类的约束

  • python中对类的约束有两种:在父类主动抛出错误;接口类/抽象类

  • Python语言惯于使用的一种约束方式,在父类主动抛出错误

    提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.

    代码示例:

    1. class Payment:
    2. """
    3. 此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
    4. """
    5. def pay(self,money):
    6. raise Exception("你没有实现pay方法")
    7. class QQpay(Payment):
    8. def pay(self,money):
    9. print('使用qq支付%s元' % money)
    10. class Alipay(Payment):
    11. def pay(self,money):
    12. print('使用阿里支付%s元' % money)
    13. class Wechatpay(Payment):
    14. def fuqian(self,money):
    15. print('使用微信支付%s元' % money)
    16. def pay(obj,money):
    17. obj.pay(money)
    18. a = Alipay()
    19. b = QQpay()
    20. c = Wechatpay()
    21. pay(a,100)
    22. pay(b,200)
    23. pay(c,300)
  • 接口类/抽象类(借鉴于Java语言,定义抽象类的概念,做到真正的强制约束)

    使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果

    代码示例:

    1. from abc import ABCMeta,abstractmethod
    2. class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
    3. @abstractmethod
    4. def pay(self):pass # 抽象方法
    5. class Alipay(Payment):
    6. def pay(self,money):
    7. print('使用支付宝支付了%s元'%money)
    8. class QQpay(Payment):
    9. def pay(self,money):
    10. print('使用qq支付了%s元'%money)
    11. class Wechatpay(Payment):
    12. # def pay(self,money):
    13. # print('使用微信支付了%s元'%money)
    14. def recharge(self):pass
    15. def pay(a,money):
    16. a.pay(money)
    17. a = Alipay()
    18. a.pay(100)
    19. pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
    20. q = QQpay()
    21. q.pay(100)
    22. pay(q,100)
    23. w = Wechatpay()
    24. pay(w,100)
    25. 总结:
    26. - 抽象类在实例化的时候,没有抽象类里边的方法就用报错
    27. - 主动抛错,只有在用到类里边的方法才会报错
    28. # 抽象类和接口类做的事情 :建立规范
    29. # 制定一个类的metaclass是ABCMeta,
    30. # 那么这个类就变成了一个抽象类(接口类)
    31. # 这个类的主要功能就是建立一个规范

5. super的深度剖析

  • super(类名,self)

    类名:要跳过的类,self指的是严格按照self对象从属类的mro的执行顺序去执行

  • 代码示例:

    1. class A:
    2. def f1(self):
    3. print('in A')
    4. class Foo(A):
    5. def f1(self):
    6. super().f1()
    7. print('in Foo')
    8. class Bar(A):
    9. def f1(self):
    10. print('in Bar') # 1
    11. class Info(Foo,Bar):
    12. def f1(self):
    13. super(Foo,self).f1()
    14. print('in Info f1') # 2
    15. obj = Info()
    16. obj.f1()
    17. #mro执行顺序:[Info Foo Bar A]
    18. # 结果:
    19. in Bar
    20. in Info f1

Python面向对象04 /封装、多态、鸭子类型、类的约束、super的更多相关文章

  1. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  2. day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析

    day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...

  3. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  4. Python()- 面向对象三大特性----多态

    多态: python 生来支持多态白话:一种事物的多种形态 (动物可以继承给狗,也可以继承给猫) class Animal: pass class Dog(Animal): def attack(se ...

  5. Python面向对象三要素-多态

    Python面向对象3要素-多态 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.多态概述 OCP原则:多用“继承”,少修改. 继承的用途:在子类上实现对基类的增强,实现多态. ...

  6. python之类的多态(鸭子类型 )、封装和内置函数property

    一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...

  7. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  8. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  9. day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)

    多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...

随机推荐

  1. Excel经典教程之一

    照片名称:未命名 照片名称:自动筛选 照片名称:在Excel中字符替换 照片名称:在Excel中直接编辑“宏” 照片名称:在Excel中为导入外部数据 照片名称:在Excel中行列快速转换 照片名称: ...

  2. TensorFlow从0到1之TensorFlow逻辑回归处理MNIST数据集(17)

    本节基于回归学习对 MNIST 数据集进行处理,但将添加一些 TensorBoard 总结以便更好地理解 MNIST 数据集. MNIST由https://www.tensorflow.org/get ...

  3. rust 神奇的特质

    pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> Strin ...

  4. 1、python简介-变量-注释-数据类型-用户交互-if语句-while循坏

    一. 计算机是什么 基本组成: 主板+cpu+内存 cpu: 主频, 核数(16) 内存:大小(8G, 16G, 32G) 型号: DDR3, DDR4, DDR5, 主频(海盗船,玩家国度) 显卡: ...

  5. Stream替代for-编码五分钟-划水五小时

    Stream替代for-编码五分钟-划水五小时 天空没有痕迹,风雨已在心中. 背景:使用Stream 流式操作取代俄罗斯式套娃的for循环,解放底层劳动密集型码畜的双手,使编码五分钟划水五小时,不再是 ...

  6. 从外包公司运作方式看EJB工作原理

    从来没用过EJB,然后进了家公司需要用,没办法,硬着头皮学吧.以下是个人学习体会,觉不好的话也不要吐槽了. 关于EJB的工作原理,你可以想象为一家公司(EJB容器),外包型的(服务接口), 公司内部有 ...

  7. SSH网上商城三

    现在我们要实现下面的需求: 当用户点击左侧二级菜单选项的时候,在右侧要显示对应的该二级菜单项下面存在哪些商品,例如点击潮流女装,要在右侧分页显示该潮流女装下对应哪些商品 1.要分页显示 首先要获得该二 ...

  8. RabbitMQ:四、跨越集群

    跨越集群主要两种插件:Federation和Shovel. 原来的rabbitmq集群将多个broker将多个节点连接起来组成逻辑上独立的单个broker,但是集群也有其局限性:集群内部借助 Erla ...

  9. 4. union-find算法

    算法的主题思想: 1.优秀的算法因为能够解决实际问题而变得更为重要: 2.高效算法的代码也可以很简单: 3.理解某个实现的性能特点是一个挑战: 4.在解决同一个问题的多种算法之间进行选择时,科学方法是 ...

  10. cv2.VideoCapture 图像旋转问题

    使用cv2.VideoCapture()时发现,分解后的图片均顺时针旋转90度, 为了重新转回来使用np.rot90(mat, 1)即逆时针将矩阵旋转90度. 大功告成!!!