https://www.cnblogs.com/liubing8/p/11321099.html

1. 封装

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

2. 多态

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

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

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

  • 代码示例:

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

3. 鸭子类型

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

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

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

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

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

  • 代码示例:

    class A:
    def login(self):
    print('登录')
    def register(self):
    print('注册')
    def func1(self):
    pass
    def func2(self):
    pass class B:
    def login(self):
    print('登录')
    def register(self):
    print('注册')
    def func3(self):
    pass # A B互为鸭子.

4. 类的约束

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

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

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

    代码示例:

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

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

    代码示例:

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
    @abstractmethod
    def pay(self):pass # 抽象方法 class Alipay(Payment):
    def pay(self,money):
    print('使用支付宝支付了%s元'%money) class QQpay(Payment):
    def pay(self,money):
    print('使用qq支付了%s元'%money) class Wechatpay(Payment):
    # def pay(self,money):
    # print('使用微信支付了%s元'%money)
    def recharge(self):pass def pay(a,money):
    a.pay(money) a = Alipay()
    a.pay(100)
    pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
    q = QQpay()
    q.pay(100)
    pay(q,100)
    w = Wechatpay()
    pay(w,100) 总结:
    - 抽象类在实例化的时候,没有抽象类里边的方法就用报错
    - 主动抛错,只有在用到类里边的方法才会报错 # 抽象类和接口类做的事情 :建立规范
    # 制定一个类的metaclass是ABCMeta,
    # 那么这个类就变成了一个抽象类(接口类)
    # 这个类的主要功能就是建立一个规范

5. super的深度剖析

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

  • 代码示例:

    class A:
    def f1(self):
    print('in A')
    class Foo(A):
    def f1(self):
    super().f1()
    print('in Foo')
    class Bar(A):
    def f1(self):
    print('in Bar') #
    class Info(Foo,Bar):
    def f1(self):
    super(Foo,self).f1()
    print('in Info f1') # obj = Info()
    obj.f1() #mro执行顺序:[Info Foo Bar A]
    # 结果:
    in Bar
    in Info f1

python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super的更多相关文章

  1. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  2. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  3. python 面向对象(四)--实例属性和类属性

    由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(object): def __init__(se ...

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

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

  5. Python面向对象三要素-封装(Encapsulation)

    Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...

  6. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  7. 封装 多态 类的约束 super

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

  8. Java 面向对象概述原理: 多态、Object类,转型(8)

    Java 面向对象概述原理: 多态.Object类,转型(8) http://docs.oracle.com/javase/tutorial/java/IandI/override.html Java ...

  9. python之面向对象性封装,多态,以及鸭子类型

    默认类型 class A: class_name = 'python23期' def __init__(self, name, age): self.name = name self.age =age ...

随机推荐

  1. Java复习目录

    还是寒假用了十多天的时间在b站把基础部分学习完了,现在刚开学开始上Java课,以博客的方式复习前面学习的内容. 总结: ①吸取前面MySQL学习的教训,每天固定学习的内容,学习效果很有提升,但临近开学 ...

  2. java中工厂模式

    最近在项目中使用了工厂模式来重构下之前的代码,在这里做个小结. 工厂模式最主要的特点是每次新增一个产品的时候,都需要新增一个新的工厂,这样在对于新的产品做扩展的时候,减少对客户端代码的修改. 我在项目 ...

  3. Linux工具之开发调试命令

    目录 gcc gdb vim pmap pstack strace readelf objdump ldd gcc 详见 gcc -E 只预处理 gcc -S 生成汇编代码 gcc -c 生成可重定向 ...

  4. 图解 Git 基本命令 merge 和 rebase

    Git 基本命令 merge 和 rebase,你真的了解吗? 前言 Git 中的分支合并是一个常见的使用场景. 仓库的 bugfix 分支修复完 bug 之后,要回合到主干分支,这时候两个分支需要合 ...

  5. linux 系统文件目录颜色及特殊权限对应的颜色

    什么决定文件目录的颜色和背景?  颜色  说明  栗子  权限 白色 表示普通文件   蓝色 表示目录  绿色 表示可执行文件 浅蓝色 链接文件 黄色 表示设备文件 红色   表示压缩文件 红色闪烁 ...

  6. Elasticsearch的query phase和fetch phase

    对于一次query查询到数据返回到客户端,经历了两个过程  query phase和fetch phase的过程 query phase 查询阶段     fetch phase 获取阶段. 1 qu ...

  7. C++核心内容和机制

    备注:不局限与C++版本   一. 基础知识 数据类型和POD/Trivial 数据类型: 类型转换: NULL和nullptr: 操作符重载: 全局静态变量和成员静态变量的申明和初始化: 左值和右值 ...

  8. 计算机网络之tcp四次挥手

    TCP的四次挥手(Four-Way Wavehand)1.前言对于"三次握手"我们耳熟能详,因为其相对的简单.但是,我们却不常听见“四次挥手”,就算听过也未必能详细地说明白它的具体 ...

  9. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

  10. 3分钟理解NMS非极大值抑制

    1. NMS被广泛用到目标检测技术中,正如字面意思,抑制那些分数低的目标,使最终框的位置更准: 2. 假如图片上实际有10张人脸,但目标检测过程中,检测到有30个框的位置,并且模型都认为它们是人脸,造 ...