python 抽象接口和协议总结

【Python】Python 函数与抽象 Python 函数与抽象,抽象是一种智慧,它不但可以节省人力,而且还是程序能够被人理解的关键所在。计算机喜欢具体而明确的指令,但人通常不是这样的。 阅读详情

通过实现特殊方法,自定义数据类型可以表现得跟内置类型一样,从而让我们写出更具表达力的代码——或者说,更具 Python 风格的代码。

功能协议接口
+__add__
*__mul__
str()先查找是否实现 __str__ 协议,没有查找是否实现 __repr__
bool()默认情况下,我们自己定义的类的实例总被认为是真的,除非这个类对 __bool__ 或者 __len__ 函数有自己的实现。bool(x) 的背后是调用 x.__bool__() 的结果;如果不存在 __bool__ 方法,那么 bool(x) 会尝试调用 x.__len__()。若返回 0,则 bool 会返回 False;否则返回 True
字符串 / 字节序列 表示形式__repr__、__str__、__format__、__bytes__
数值转换__abs__、__bool__、__complex__、__int__、__float__、__hash__、__index__
集合模拟__len__、__getitem__、__setitem__、__delitem__、__contains__
迭代枚举__iter__、__reversed__、__next__
可调用模拟__call__
上下文管理__enter__、__exit__
实例创建和销毁__new__、__init__、__del__
属性管理__getattr__、__getattribute__、__setattr__、__delattr__、__dir__
属性描述符__get__、__set__、__delete__
跟类相关的服务__prepare__、__instancecheck__、__subclasscheck__
一元运算符__neg__ -、__pos__ +、__abs__ abs()
众多比较运算符__lt__ <、__le__ <=、__eq__ ==、__ne__ !=、__gt__ >、__ge__ >=
算术运算符__add__ +、__sub__ -、__mul__ *、__truediv__ /、__floordiv__ //、__mod__ %、__divmod__ divmod()、__pow__ ** 或 pow()、__round__ round()
反向算术运算符__radd__、__rsub__、__rmul__、__rtruediv__、__rfloordiv__、__rmod__、__rdivmod__、__rpow__
增量赋值算术运算符__iadd__、__isub__、__imul__、__itruediv__、__ifloordiv__、__imod__、__ipow__
位运算符__invert__ ~、__lshift__ <<、__rshift__ >>、__and__ &、__or__ |、__xor__ ^
反向位运算符__rlshift__、__rrshift__、__rand__、__rxor__、__ror__
增量赋值位运算符__ilshift__、__irshift__、__iand__、__ixor__、__ior__

更具体细致的表格总结如下

1.基础知识
在这里插入图片描述
在这里插入图片描述

  • 对 __init__() 方法的调用发生在实例被创建 之后 。如果要控制实际创建进程,请使用 __new__() 方法
  • 按照约定, __repr__() 方法所返回的字符串为合法的 Python表达式。
  • 在调用 print(x) 的同时也调用了 __str__() 方法。
  • 由于 bytes 类型的引入而从 Python 3 开始出现
  • 按照约定,format_spec 应当遵循 迷你语言格式规范Python 标准类库中的decimal.py 提供了自己的 __format__() 方法。

2.行为方式与迭代器类似的类

在这里插入图片描述

  • 无论何时创建迭代器都将调用 __iter__() 方法。这是用初始值对迭代器进行初始化的绝佳之处。
  • 无论何时从迭代器中获取下一个值都将调用 __next__() 方法。
  • __reversed__() 方法并不常用。它以一个现有序列为参数,并将该序列中所有元素从尾到头以逆序排列生成一个新的迭代器

3.计算属性
在这里插入图片描述
在这里插入图片描述

  • 如果某个类定义了 __getattribute__() 方法,在 每次引用属性或方法名称时 Python 都调用它(特殊方法名称除外,因为那样将会导致讨厌的无限循环)
  • 如果某个类定义了 __getattr__() 方法,Python 将只在正常的位置查询属性时才会调用它。如果实例 x 定义了属性 color,x.color 将 不会 调用 x.__getattr__('color');而只会返回x.color 已定义好的值。
  • 无论何时给属性赋值,都会调用 __setattr__() 方法。
  • 无论何时删除一个属性,都将调用 __delattr__() 方法。
  • 如果定义了 __getattr__() 或 __getattribute__() 方法,__dir__() 方法将非常有用。通常,调用 dir(x) 将只显示正常的属性和方法。如果 __getattr()__ 方法动态处理 color 属性,dir(x) 将不会将 color 列为可用属性。可通过覆盖 __dir__()方法允许将 color 列为可用属性,对于想使用你的类但却不想深入其内部的人来说,该方法非常有益。

__getattr__() 和 __getattribute__() 方法的区别非常细微,但非常重要。可以用两个例子来解释一下

# -*- coding: utf-8 -*-


class Dynamo:

    # 属性名称以字符串的形式传入 __getattr()__ 方法。如果名
    # 称为 'color',该方法返回一个值。(在此情况下,它只是一个
    # 硬编码的字符串,但可以正常地进行某些计算并返回结果。)
    def __getattr__(self, key):
        if key == 'color':
            return 'PapayaWhip'
        else:
            # 如果属性名称未知, __getattr()__ 方法必须引发一个
            # AttributeError 例外,否则在访问未定义属性时,代码将只会
            # 默默地失败。(从技术角度而言,如果方法不引发例外或显式
            # 地返回一个值,它将返回 None ——Python 的空值。这意味着 所
            # 有 未显式定义的属性将为 None,几乎可以肯定这不是你想看到
            # 的。)
            raise AttributeError


if __name__ == '__main__':
    dyn = Dynamo()
    # dyn 实例没有名为 color 的属性,因此在提供计算值时将调用
    # __getattr__() 。  
    print(dyn.color)
    # PapayaWhip
    
    dyn.color = 'LemonChiffon'
    # 在显式地设置 dyn.color 之后,将不再为提供 dyn.color 的
    # 值而调用 __getattr__() 方法,因为 dyn.color 已在该实例中定
    # 义。
    print(dyn.color)
    # LemonChiffon


另一方面,__getattribute__() 方法是绝对的、无条件的。

# -*- coding: utf-8 -*-


class SuperDynamo:

    def __getattribute__(self, key):
        if key == 'color':
            return 'PapayaWhip'
        else:
            raise AttributeError


if __name__ == '__main__':
    dyn = SuperDynamo()

    # 在获取 dyn.color 的值时将调用 __getattribute__() 方法
    print(dyn.color)
    # PapayaWhip
    dyn.color = 'LemonChiffon'
    # 即便已经显式地设置 dyn.color,在获取 dyn.color 的值时,
    # 仍将调用 __getattribute__() 方法。如果存在
    # __getattribute__() 方法,将在每次查找属性和方法时 无条件
    # 地调用 它,哪怕在创建实例之后已经显式地设置了属性。
    print(dyn.color)
    # PapayaWhip

tips:
如果定义了类的 __getattribute__()方法,你可能还想定义一个 __setattr__()方法,并在两者之间进行协同,以跟踪属
性的值。否则,在创建实例之后所设置的值将会消失在黑洞中。

必须特别小心 __getattribute__() 方法,因为 Python 在查找类的方法名称时也将对其进行调用。

# -*- coding: utf-8 -*-


class Rastan:

    def __getattribute__(self, key):
        # 该类定义了一个总是引发 AttributeError 例外的
        # __getattribute__() 方法。没有属性或方法的查询会成功。  
        raise AttributeError

    def swim(self):
        return "swim"


if __name__ == '__main__':
    hero = Rastan()
    # 调用 hero.swim() 时,Python 将在 Rastan 类中查找 swim()
    # 方法。该查找将执行整个 __getattribute__() 方法,因为所有
    # 的属性和方法查找都通过 __getattribute__() 方法。在此例
    # 中, __getattribute__() 方法引发 AttributeError 例外,因此
    # 该方法查找过程将会失败,而方法调用也将失败。
    hero.swim()
    # Traceback (most recent call last):
    #   File "C:/myFiles/company_project/xbot/my_test/getattribute_test.py", line 22, in <module>
    #     hero.swim()
    #   File "C:/myFiles/company_project/xbot/my_test/getattribute_test.py", line 9, in __getattribute__
    #     raise AttributeError
    # AttributeError


4.行为方式与函数类似的类
可以让类的实例变得可调用——就像函数可以调用一样——通过定义 __call__() 方法。

在这里插入图片描述
5.行为方式与序列类似的类
如果类作为一系列值的容器出现——也就是说如果对某个类来说,是否“包含”某值是件有意义的事情——那么它也许应该定义
下面的特殊方法已,让它的行为方式与序列类似。

在这里插入图片描述
6.行为方式与字典类似的类
在这里插入图片描述

7.行为方式与数值类似的类

使用适当的特殊方法,可以将类的行为方式定义为与数字相仿。也就是说,可以进行相加、相减,并进行其它数学运算。
在这里插入图片描述
在这里插入图片描述

之前提到的特殊方法集合采用了第一种方式:对于给定 x / y,它们为 x 提供了一种途径来表述“我知道如何将自己除以 y。”下
面的特殊方法集合采用了第二种方法:它们向 y 提供了一种途径来表述“我知道如何成为分母,并用自己去除 x。
在这里插入图片描述
在这里插入图片描述
对于复合运算(原地操作符)
在这里插入图片描述
在这里插入图片描述
注意:多数情况下,并不需要原地操作方法。如果未对特定运算定义“就地”方法,Python 将会试着使用(普通)方法。例
如,为执行表达式 x /= y,Python 将会:

  • 试着调用 x.__itruediv__(y)。如果该方法已经定义,并返回了 NotImplemented 之外的值,那已经大功告成了。
  • 试图调用 x.__truediv__(y)。如果该方法已定义并返回一个NotImplemented 之外的值, x 的旧值将被丢弃,并将所返回的
    值替代它,就像是进行了 x = x / y 运算。
    试图调用 y.__rtruediv__(x)。如果该方法已定义并返回了一个 NotImplemented 之外的值,x 的旧值将被丢弃,并用所返回值进行替换

因此如果想对原地运算进行优化,仅需像 __itruediv__() 方法一样定义“原地”方法。否则,基本上 Python 将会重新生成原地
运算公式,以使用常规的运算及变量赋值。

还有一些“一元”数学运算,可以对“类‐数字”对象自己执行
在这里插入图片描述
在这里插入图片描述

8.可比较的类

如果要创建自己的类,且对象之间的比较有意义,可以使用下面的特殊方法来实现比较。
在这里插入图片描述
tips:
如果定义了 __lt__() 方法但没有定义__gt__()方法,Python 将通过经交换的算子调用 __lt__() 方法。然而,Python 并不
会组合方法。例如,如果定义了 __lt__()方法和 __eq()__ 方法,并试图测试是否 x<= y,Python 不会按顺序调用 __lt__() 和__eq()__ 。它将只调用 __le__() 方法。

9.可序列化的类

Python 支持 任意对象的序列化和反序列化。(多数 Python 参考资料称该过程为 “pickling” 和 “unpickling”)。该技术对与将状态保存为文件并在稍后恢复它非常有意义。所有的 内置数据类型 均已支持 pickling 。如果创建了自定义类,且希望它能够pickle,阅读 pickle 协议 了解下列特殊方法何时以及如何被调用。
在这里插入图片描述
在这里插入图片描述
要重建序列化对象,Python 需要创建一个和被序列化的对象看起来一样的新对象,然后设置新对象的所有属性。__getnewargs__() 方法控制新对象的创建过程,而__setstate__() 方法控制属性值的还原方式。

10.可在WITH语块中使用的类
with 语块定义了 运行时刻上下文环境;在执行 with 语句时将“进入”该上下文环境,而执行该语块中的最后一条语句将“退出”
该上下文环境。
在这里插入图片描述
该 __exit__() 方法将总是被调用,哪怕是在 with 语块中引发了例外。实际上,如果引发了例外,该例外信息将会被传递给 __exit__() 方法。查阅 With 状态上下文环境管理器 了解更多细节。

11.真正神奇的东西

如果知道自己在干什么,你几乎可以完全控制类是如何比较的、属性如何定义,以及类的子类是何种类型。
在这里插入图片描述
在这里插入图片描述
tips: 确切掌握 Python 何时调用 __del__() 特别方法 是件难以置信的复杂事情。要想完全理解它,必须清楚 Python 如何在内存中跟踪对象。了解 Python 垃圾收集和类析构器。还可以阅读 《弱引用》、《weakref 模块》,还可以将 《gc模块》 当作补充阅读材料。

【python】深入探讨python中的抽象类,创建、实现方法以及应用实战 在Python中,抽象类是一种特殊的类,它不能被直接实例化,而是作为其他类的基类,用于定义一组接口规范,确保派生类(子类)实现特定的方法。抽象类通过强制子类实现特定的方法来提供代码的规范性和可维护性。本文将详细讲解Python中抽象类的用法,并结合实际案例进行说明。 阅读详情

相关推荐

接口:从协议到抽象基类 Python

抽象基类是一种显式定义接口的方式,它是一个包含抽象方法的类。在Python中,接口是一种定义了对象应该具有的方法和属性的方式。在本文中,我们将探讨接口的概念,并介绍Python中实现接口的两种常见方式:协议和抽象基类。除了协议外,Python还提供了抽象基类(Abstract Base Class,简称ABC)的概念,它是一种显式定义接口的方式。抽象基类是一个包含抽象方法(即只有方法声明而没有具体实现的方法)的类。在Python中,协议是一种无形的接口,它是通过对象的行为来定义的。类,并提供了具体的实现。

YOLOv6666的博客 93

Python中的抽象类(简单易懂版)

Python中的抽象类(一看就懂!!!)

Elon15的博客 1万+

【模拟电子设计实战】开源!基于Multisim与AD620的心电采集电路仿真与优化

本文详细介绍了基于Multisim与AD620的心电采集电路仿真与优化实战。通过分析心电信号采集的挑战,重点讲解了AD620仪表放大器和OP07运算放大器的选型优势及电路设计技巧,包括对抗50Hz工频干扰和基线漂移的优化方法。文章还分享了Multisim仿真参数设置与实测对比经验,最终实现性能达标的心电采集电路设计。

weixin_30555125的博客 95

Python设计模式二:接口类和抽象类(Python接口设计)

系列文章目录 Python设计模式一:面向对象编程 文章目录系列文章目录前言一、接口类和抽象类是什么?二、使用步骤1.引入库2.读入数据总结 前言   继第一篇面向对象编程,在文末也提到了interface这个其他OOP语言的语法规则,那让我们开始第二篇接口类和抽象类的介绍。   在学习设计模式的时候,发现"基于接口编程而非实现"这个设计原则非常的有用,但一直只接触Python的话,对接口的概念大概是一直停留在API接口上。所以对这个设计原则会非常陌生,更别提接口类和抽象类的定义了,那这篇文章就值得一看

weixin_42681866的博客 6818

【MM小贴士】关于SAP系统中关税的处理方式

的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。.........

竹大的博客 9029

在MacBook M1/M2上,手把手教你打包包含嵌入模型的RagFlow Docker镜像(避坑指南)

本文详细指导如何在MacBook M1/M2上构建ARM64架构的RagFlow Docker镜像,涵盖环境准备、依赖处理、镜像构建及性能优化全流程。特别针对Apple Silicon芯片的兼容性问题提供解决方案,帮助开发者高效完成本地开发环境搭建。

weixin_26908317的博客 242

Python抽象类和接口类

在抽象类中,我们可以对一些抽象方法做出基础实现; 而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

m0_59485658的博客 964

产品需求从场景,初始需求IR,产品需求 OR,设计需求DR,设计规格DS的具体案例说明,以扫地机产品为例

摘要: 以扫地机器人"宠物粪便避障"功能为例,说明从用户场景到产品落地的完整需求转化路径。初始需求(IR)源于养宠家庭痛点,要求100%避障并自动告警;产品需求(OR)转化为≥98%识别准确率等量化指标;设计需求(DR)拆解为感知、决策、执行三大技术模块;最终形成传感器选型(如索尼IMX678)、芯片规格(高通QCS6490)等设计规格(DS)。通过实验室模拟和用户测试验证,该功能使产品溢价30%,养宠家庭购买占比达52%,实现技术与商业价值的统一。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 771

Python 接口:从协议到抽象基 类(Python文化中的接口和协议)

写作本书时,Python 3 中 memoryview 的文档(https://docs.python.org/3/library/stdtypes.html#typememoryview)说,它。类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或。的,示例 11-1 是 Vector2d 类的第一版,x 和 y 是公开属性。的方法集合,这样理解正是 Smalltalk 程序员所说的协议,其他动态语。能处理“支持缓冲协议的对象”,不过缓冲协议的文档是针对 C API。

钢铁男儿 639

全志T527 适配双目tp2815_mipi

在全志T527 linux下适配双目TP2815 mipi摄像头,支持六路同时输出,四路可用作360环视、一路face id等,一路用于其它开发。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3818

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

Python中的接口协议和抽象基类

Python接口与协议Python语言是没有interface关键字的,这也是动态类型语言的特点之一。Python的接口指的是类实现或继承的公开属性,包括数据或方法。比如Sequence的...

自动化代码美学 250

SOME/IP协议详解「1.1·面向服务与面向信号」

面向信号和面向服务的区别,和举例子

雪云飞星的博客 5656

Python中的接口、抽象基类和协议

本文探讨了面向对象编程中的接口与抽象基类应用。通过吃汉堡的示例对比了两种编程方式:面向实现编程会导致代码扩展性差,而面向接口编程(依赖抽象基类)则提高了灵活性。文章详细介绍了Python中抽象基类(ABC)的使用方法,包括类型注解、运行时检查和虚拟子类注册。进一步讲解了Python协议的强大之处,通过上下文管理器协议和迭代器协议展示了鸭子类型的优势。最后介绍了Python 3.8引入的静态协议(Protocol)及其运行时检查装饰器@runtime_checkable,实现了更加松耦合的依赖倒置。

weixin_64569462的博客 1527

用 SemanticObject 把字段变成可点击链接:Fiori Elements Navigation Using a Link 的工程化实践

SAP Fiori elements 通过 Common.SemanticObject 注解可将字段转为可点击链接,实现应用间跳转。当源字段名与目标属性名不一致时,需使用 Common.SemanticObjectMapping 进行映射。该功能依赖 Fiori Launchpad 的目标映射配置,确保正确解析 semantic object + action 并传递参数。常见误区包括未配置目标映射或字段映射错误,需逐一检查语义标注、intent 解析和参数传递链路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《Fluent Python》第十三章 接口 协议和抽象基类

本章阐述了Python中接口编程的四种类型实现方式:鸭子类型(运行时结构)、大鹅类型(运行时名义,基于ABC)、静态鸭子类型(静态结构,基于Protocol)和静态类型(静态名义)。重点对比了动态协议与静态协议、结构类型与名义类型的差异,并通过序列协议、Tombola抽象基类及typing.Protocol等示例,说明如何在保持灵活性的同时实现接口契约与类型安全。

simon_skywalker的博客 403

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

主要内容首先,本章说明抽象基类的常见用途:实现接口时作为超类使用说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作最后, 说明如何让抽象基类自动“识别”任何符合接口的类——不进行子类化或注册。补充知识点第十章&第十一章:协议,指来自父类的继承关系、或者接口的强制性约束要求鸭子类型:看起来像只鸭子,吃起来是鸭肉,无论它是否是鸭蛋孵...

weixin_33600827的博客 247

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

13. 第13章 接口, 协议和抽象基类

13.1 类型图 13.2 本章新增内容 13.3 两种协议 13.4 利用鸭子类型编程 13.4.1 Python喜欢序列 13.4.2 使用猴子补丁在运行时实现协议 13.4.3 防御性编程和’快速失败’ 13.5 大鹅类型 13.5.1 子类化一个抽象基类 13.5.2 标准库中的抽象基类 13.5.3 定义并使用一个抽象基类 13.5.4 抽象基类句法详解 1

清风 575

Fluent Python - Part11 接口:从协议到抽象基类

抽象类表示接口 --- Bjarne Stroustrup (C++ 之父) 本章讨论的话题是接口:从鸭子类型的代表特征动态协议, 到使接口更明确,能验证实现是否符合规定的抽象基类(Abstract Base Class, ABC) 我们将实现一个新抽象基类,看看它的运作方式。但是,作者不建议你自己编写抽象基类,因为很容易过度设计。 Python 文化中的接口和协议 关于接口,这里有个实用的补充定义:对象公开方法的子集,让对象在系统中扮演特定的角色。Python 文档中的“文件类对象”或“可迭代对象.

qq_34921856的博客 746

Python编程:接口

Python经典进阶教程!

weixin_56051592的博客 1万+

接口:从协议到抽象基类

抽象类表示接口。                    ---------Bjarne StroustrupC++之父 Python中的接口和协议 引入抽象基类之前,python就已经很成功了,即便现在也很少有代码使用抽象基类。协议可以看成是非正式的接口,是python这种动态语言实现动态的方式。 接口在动态语言中是如何运作的呢?首先,python中除了抽象基类,每个类都有接口:类实现和公开...

weixin_30402085的博客 207

python接口:从协议到抽象基类

python接口:从协议到抽象基类Python文化中的接口和协议python序列使用猴子补丁在运行时实现协议 抽象类表示接口。 ——Bjarne Stroustrup C++之父 Python文化中的接口和协议 Python语言没有interface关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__或__add__。 受保护的属性和私有属性不在接口中:即便“受保护的”属性也只是采用命名约定实现的(单个前导下划线);私有属性可以轻松地

每天都要进步的博客 300

python接口类型有哪些_Python抽象类和接口有什么区别【面试题详解】

今天爱分享给大家带来Python抽象类和接口有什么区别【面试题详解】,希望能够帮助到大家。看看下面这个:class Abstract1(object):"""Some description that tells you it's abstract,often listing the methods you're expected to supply."""def aMethod(self):ra...

weixin_36246453的博客 153

流畅的python笔记(十一)接口:从协议到抽象类型

一、python文化中的接口与协议 接口定义:每个类都有接口,类实现或继承的公开属性(方法或数据属性),包括特殊方法,都是接口。受保护的属性和私有属性不在接口中(即便在python并不存在真正受保护的和私有的属性,而只是采用命名约定实现的)。 接口补充定义:对象公开方法的自己,让对象在系统中扮演特定的角色。python文档中的文件类对象或可迭代对象就是指这样一些类,它们实现了文件类对象的方法集合或可迭代需要的方法集合。 协议是接口,但不是正式的,只由文档和约定定义。比如序列协议,是python最基础的

向上吧贺凯 1072

python白鹅类型_python之接口:从协议到抽象基类

前言:在本章节中,新增一个白鹅类型,用于区别鸭子类型;另外,抽象基类的知识也表明,抽象基类,是用于构建框架,在遇到问题的时候首选通过别的方式实现,而不是抽象基类的方式。1 鸭子类型和白鹅类型:这是两种编程风格,有很大的不同鸭子类型:在这种编程风格中,我不太关心对象的类型,而是关注对象实现了何种方法,也就是说,对象的类型不再由父类决定,而是由方法决定。因此,鸭子类型风格时,不用通过检查参数、类型什么...

weixin_39627390的博客 290

python接口类型有哪些_Python-14-class 类的接口

Python 中的接口问题作为习惯了 java 语言的开发者来说,我首先想到的是,python 有接口吗?然后查了一下。大部分的解答如下:没有。在Python中没必要使用类似Java的interface。因为Python里有多继承和使用鸭子类型。在Python中,协议就是接口。例如上下文管理协议,只要实现了对应的__enter__, __exit__方法就实现了这个上下文管理协议。Java中的接口...

weixin_39933508的博客 655
上一篇: 求股票最大收益问题
下一篇: python 内置序列类型概览
MZP_man
博客等级 码龄8年 188粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值