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. [CF1270F]Awesome Substrings

    题目   点这里看题目. 分析   设前缀和\(s_r=\sum_{i=1}^r [S_i='1']\)   考虑满足要求的子串\((l,r]\)的要求: \[\exists k\in N_+, r- ...

  2. @atcoder - AGC026F@ Manju Game

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个含 N 个数的序列,Alice 与 Bob 在博弈.Al ...

  3. Zookeeper——Watcher原理详解

    文章目录 引言 正文 一.如何注册监听 二.如何触发监听事件 三.事件类型有哪些 四.Watcher可以被无限次触发么?为什么要这么设计? 五.Watcher实现原理 1. 客服端发送请求 a. 初始 ...

  4. 跨云厂商部署 k3s 集群

    原文链接:https://fuckcloudnative.io/posts/deploy-k3s-cross-public-cloud/ 最近一两年各大云服务商都出了各种福利活动,很多小伙伴薅了一波又 ...

  5. Sharding-JDBC 快速入门第一课

    1.  概述 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Proxy和Sharding-Sidecar(计划中)这 ...

  6. 一文梳理JavaScript中的this

    最近零零碎碎看了许多关于this的文章,本着"好记性不如烂笔头"的思想,特在这里整理一下this有关的知识点.[长文警告!!!] 接下来,笔者将按照以下目录对this进行阐述: t ...

  7. APP移动端测试

    重点: app测试的内容 add 命令  monkey命令 次重点:模拟器的安装 雷电 夜神 android 自带的模拟器 真机测试 简单了解云测Testing  腾讯云() 了解:市场有点移动端的操 ...

  8. [ C++ ] 勿在浮沙筑高台 —— 内存管理(1~8p)primitives(上)

    C++ memory primitives(原语) new 若malloc失败会调用 int _callnewh(size_t t); 即调用用户设定的handler(回调函数指针),可用于内存回收防 ...

  9. Java闭包概念

    闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关 ...

  10. redis高级命令2

    主服务负责数据的写,从服务器负责客户端的高并发来读 创建主从复制 clone不能让上面的mac地址不能重复,IP地址也不能重复 122和123是从服务器,我们修改二者的配置文件 其中 192.168. ...