Python 入门 之 类的约束以及super()剖析

1、类的约束

第一版:
class WechatPay: def pay(self):
print("微信支付") class AliPay: def pay(self):
print("支付宝支付") class QQpay: def fuqian(self):
print("QQ支付") wei = WechatPay()
ali = AliPay()
qq = QQpay() wei.pay()
ali.pay()
qq.fuqian() # 当统一接口时
def pay(object):
object().pay() # QQ支付无法实现归一化
第二版:
class PayClass: def pay(self):
pass class WechatPay(PayClass): def pay(self):
print("微信支付") class AliPay(PayClass): def pay(self):
print("支付宝支付") class QQpay(PayClass): def fuqian(self):
print("QQ支付") def pay(object): object().pay() pay(WechatPay)
pay(QQpay) # QQpay会执行父类的pay方法但是无法完成支付

(1)对类的约束有两种:

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

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

第三版:
# 方式一: (推荐并且常用的方式)
# raise 主动抛出异常(主动报错)
class PayClass:
def pay(self):
raise Exception("你子类必须要写一个pay方法") class WechatPay(PayClass): def pay(self):
print("微信支付") class AliPay(PayClass): def pay(self):
print("支付宝支付") class QQpay(PayClass): def fuqian(self):
print("QQ支付") def pay(object):
object().pay() pay(WechatPay)
pay(QQpay) # QQpay类中没有pay方法,raise就会主动抛出异常(主动报错) # 方法二
# 抽象类,接口类: 制定一些规则
from abc import ABCMeta,abstractmethod # 抽象类,接口类
class PayClass(metaclass=ABCMeta): # 元类
@abstractmethod
def pay(self):
raise Exception("你子类必须要写一个pay方法") class WechatPay(PayClass): def pay(self):
print("微信支付") class AliPay(PayClass): def pay(self):
print("支付宝支付") class QQpay(PayClass): def fuqian(self):
print("QQ支付") def pay(object):
object().pay() pay(WechatPay)
pay(AliPay)
pay(QQpay) # QQpay类中没有pay方法,就会与指定的规则不符导致报错 '''
**总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种: ​ 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的 ​ 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)
'''

2、super 剖析:

super是严格按照类的继承顺序执行

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里的类名是指定查找mro中类名的下一个类, self是指定查找时使用的mro顺序
super(Info,self).f1() # Foo() 对象的内存地址 # super(子类名,子类的mro列表)
print('in Info f1') aa = Info() # 对象的内存地址
aa.f1() # Info [Info', Foo', Bar', A', 'object'] a = Foo()
b = a
print(a)
print(b) print(Info.mro())
obj = Info()
obj.f1()

Python 入门 之 类的约束以及super()剖析的更多相关文章

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

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  2. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

  3. Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)

    Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...

  4. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  5. Python 入门 之 类成员

    Python 入门 之 类成员 1.类的私有成员: 私有: 只能自己拥有 以 __ 开头就是私有内容 对于每一个类的成员而言都有两种形式: - 公有成员,在任何地方都能访问 - 私有成员,只有在类的内 ...

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

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

  7. python之路--类的约束, 异常处理, MD5, 日志处理

    一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...

  8. python入门17 类和对象

    类:一类事物的抽象化.概念: 类的变量(属于类的变量,定义在类的开始处)  成员变量(self.变量) 类的方法( @classmethod,cls参数)   成员方法( self参数 )  静态方法 ...

  9. python记录_day019 类的约束 异常处理 日志

    一 .约束 python中约束有两种 第一种,通过抛异常进行约束,这种是子类不按我要求的来,我就给你抛异常(推荐) 操作:提取一个父类. 在父类中给出一个方法.但在方法中不给出任何代码,直接抛异常 # ...

随机推荐

  1. LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)

    题目链接 https://loj.ac/problem/2733 题解 神仙题-- 首先可以观察到一个结论: 目标块的两块小三明治一定分别是最后和倒数第二个被吃的. 由此我们可以考虑这两块谁先被吃.这 ...

  2. python-无联网情况下安装skt-learn

    请从上到下安装 numpy importlib pytz python-dateutil pandas scipy pasty statemodels backports.functools_lru_ ...

  3. jmeter参数化之 CSV data set config

    第一步:测试计划右键--创建线程组   第二步:选择线程组:右键--sample---创建:http request 配置协议类型和服务名称,method 和path 第三步:选择线程组下的http ...

  4. (转)linux中wget未找到命令

    转:https://blog.csdn.net/djj_alice/article/details/80407769 在装数据库的时候发现无法使用wget命令,提示未找到命令,如图所示 那是因为没有安 ...

  5. Linux之bzip2命令

    命令格式: bzip2 [-cdz] 档名 参数: -d :解压缩的参数 -z :压缩的参数 -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--be ...

  6. Android Stuido中断点调试和高级调试

    写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...

  7. react判断点击位置是否为组件内,实现点击外部触发组件内事件

    1.导入 import {findDOMNode} from 'react-dom' 2.绑定ref <div ref="refTest" </div> 3.绑定 ...

  8. 安德鲁1.2Ku使用感受

    看中玻璃钢天线了,华达太贵,安德鲁性价比比较高.就在上周,决定入一个试试.周二微信转账,380+120运费,安能物流送货上门,上周6中午午睡时接到电话.去广场拿货. 锅面包装很简单,纸壳与胶带简单粗暴 ...

  9. 2019.11.18【每天学点SAP小知识】Day4 - ABAP 7.40新语法 FOR

    "今天学习一下FOR的语法,常用的2个语法. FOR wa|<fs> IN itab [INDEX INTO idx] [cond] "FOR i = … [THEN ...

  10. ANSI C遍历二维数组指针地址

    #include <stdio.h> int main() { ][] = {,,,}; //等价于{{1,2},{3,4}}; ; i < ; i++) { ; j < ; ...