流畅的python笔记(二十一)类元编程

python:logging --- Python 的日志记录工具 阅读详情

目录

前言

一、类工厂函数

二、定制描述符的类装饰器

三、导入时和运行时比较

场景练习

场景1解答

场景2解答

四、元类基础知识

场景练习 

场景3解答

场景4解答

五、定制描述符的元类

六、元类的特殊方法__prepare__

七、类作为对象


前言

类元编程是指在运行时创建或定制类的技艺。python中类是一等对象,因此任何时候都可以使用函数新建类,而无需使用class关键字。类装饰器也是函数,不过能够审查、修改甚至把被装饰的类替换成其他类。

        最后,元类是类元编程最高级的工具:使用元类可以创建具有某种特质的全新类种,比如抽象基类。

        除非开发框架,否则不要编写元类!

一、类工厂函数

最常见的类工厂函数比如collections.namedtuple,我们把一个类名和几个属性名传给这个函数,它就会创建一个tuple的子类,其中元素可以通过名称获取,即具名元组,也可以认为是不可变的字典。

        假设编写一个宠物店应用程序,创建一个狗类:

我们可以看到,在编写上面代码的时候,各个字段的名称都出现了三次,参数列表中一次,=号两边各一次,这样很麻烦,且字符串表示形式也不好。

参考collections.namedtuple,下面我们创建一个record_factory函数,即时创建简单的类(比如Dog),record_factory函数的用法如下所示:

  1. 工厂函数record_factory的签名与namedtuple类似:先写类名,后面跟着写在一个字符串里的多个属性名,使用空格或逗号分开。
  2. 友好的字符串表示形式。
  3. 实例是可迭代对象,因此赋值时可以使用可迭代对象拆包。
  4. 传给format函数时也可以拆包。
  5. 实例是可变的对象。
  6. 新建的类继承自object,与我们的工厂函数record_factory没有关系。

  1.  这里体现鸭子类型:尝试在逗号或空格处拆分field_names,如果失败,那么假定field_names本就是可迭代的对象,一个迭代元素就对应一个属性名。
  2. 使用属性名构建元素,这将成为新建类的__slots__属性。此外,这么做还设定了拆包和字符串表示形式中各字段的顺序。
  3. 这个函数将成为新建类的__init__函数。参数有位置参数和关键字参数。
  4. 实现__iter__函数,把类的实例变成可迭代的对象。按照__slots__设定的顺序产出字段值。
  5. 迭代__slots__和self,生成友好的字符串表示形式。
  6. 组建类属性字典。
  7. 调用type构造方法,构建新类,然后将其返回,新类的名称是cls_name参数的值,唯一的直接超类是object,有__slots__,__init__、__iter__、__repr__四个类属性,其中后三个是实例方法。

把三个参数传给type是动态创建类的常用方式。通常我们把type当成函数用,type(my_object)获取对象所属的类,作用与my_object.__class__相同。然而type实际上是一个类,当成类使用时,传入三个参数可以新建一个类(type的三个参数分别是name、bases和dict,dict是一个字典,指定新类的属性名和值):

上述代码作用与下述代码相同:

type类的实例是类,比如这里的MyClass类。

        用record_factory函数创建的类,其实例有个局限------不能序列化,即不能使用pickle模块中的dump/load函数处理。此问题暂不解决。

二、定制描述符的类装饰器

在本书上一章节即第二十章处,LineItem示例还有问题尚待解决:储存属性的名称不具有描述性。即属性(如weight)的值存储在名为_Quantity#0的实例属性中,这样的名称不便调试。从托管实例中的描述符实例的storage_name属性能获取储存属性的名称:

如果储存属性的名称中能包含托管属性的名称更好:

上一章节中,之所以储存属性用了_Quantity#0泽中奇怪的名字,是因为实例化描述符时还无法得知托管属性的名称(比如weight)。但是一旦组建好整个类,而且把描述符绑定到类属性上之后,我们就可以审查类,并为描述符设置合理的储存属性名称。LineItem类的__new__方法可以做到这一点,因此在__init__方法中使用描述符时,储存属性已经设置了正确的名称。为了解决这个问题而使用__new__纯属白费力气:每次新建LineItem实例时都会运行__new__方法中的逻辑,可以,一旦LineItem类构建好了,描述符与托管属性之间的绑定就不会变了。即我们要在创建类时设置储存属性的名称,使用类装饰器或元类可以做到这一点。

        类装饰器与函数装饰器非常类似,是参数为类对象的函数,返回原来的类或修改后的类。

 

  1.  装饰器函数的参数是一个类。
  2.  迭代存储类属性的字典。
  3.  如果属性是Validated描述符类的实例。
  4.  使用描述符类的名称type_name和托管属性的名称key来命名storage_name。
  5.  返回修改后的类。

类装饰器能以较简单的方式做到以前需要使用元类去做的事情------创建类时定制类。类装饰器有个重大缺点:只对直接装饰的类有效,这意味着被装饰的类的子类可能继承也可能不继承装饰器所作的改动,具体情况视改动的方式而定。

 

三、导入时和运行时比较

python程序员会区分导入时和运行时,但是这两个术语没有严格区分,且二者之间存在灰色地带。

        导入时,解释器会从上到下一次性解析完.py模块的源码,然后生成用于执行的字节码。如果句法有错误,就在此时报告。如果本地的__pycache__文件夹中有最新的.pyc文件,解释器会跳过上述步骤,因为已经有运行所需的字节码了。编译肯定是导入时的活动,但那个时期还会做些其他事,由于python中的语句几乎都是可执行的,也就是说语句可能会运行用户代码,修改用户程序的状态。尤其是import语句,它不只是声明,在进程中首次导入模块时,还会运行所导入模块中的全部顶层代码,以后导入相同的模块则使用缓存,只做名称绑定。那些顶层代码可以做任何事,包括通常在运行时做的事,例如连接数据库。因此导入时和运行时之间的界限是模糊的:import语句可以触发任何运行时行为。

        导入模块时,解释器会执行顶层的def语句,首次导入模块是,解释器会编译函数的定义体,把函数对象绑定到对应的全局名称上,但是解释器不会执行函数的定义体。通常着意味着解释器在导入时定义顶层函数,但是仅当在运行时调用函数时才会执行函数的定义体。

        对类来说,情况不同:在导入时解释器会执行每个类的定义体,甚至会执行嵌套类的定义体。执行类定义体的结果是,定义了类的属性和方法,并构建了类对象。从这个意义上理解,类的定义体属于顶层代码,因为它在导入时运行。

场景练习

        下面是几个场景练习,假设在evaltime.py脚本中导入了evalsupport.py模块:

 

 

 

场景1解答

  1.  导入evaltime模块是,会运行其顶层代码,evaltime模块第一行就是导入evalsupport模块中的deco_alpha函数,因此先执行evalsupport模块中的顶层代码。但是,解释器会编译deco_alpha函数,却不会执行定义体。
  2.  MetaAleph类的定义体在导入evalsupport模块时被执行。
  3.  类的定义体在导入时都会被执行,这里是evaltime模块中Classone类的定义体被执行。
  4.  嵌套类的定义体也会被执行。
  5.  先执行被装饰的类ClassThree的定义体,然后运行装饰器函数。
  6.  在这个场景中evaltime模块是被导入的,因此不会运行if __name__ == '__main__'块。

对于场景1,有几点注意:

  • 这个场景由简单的import evaltime语句触发。
  • 解释器会执行所导入模块及其依赖中的每个类定义体。
  • 解释器先执行类定义体,然后调用依附在类上的装饰器函数,这是合理的,因为必须先构建类对象,装饰器才有类对象可处理。
  • 在这个场景中只运行了一个用户定义的函数或方法,即deco_alpha装饰器。

场景2解答

  1. 到此为止与场景1输出一样。
  2. 初始化了一个Classone对象,执行了其__init__方法。
  3. deco_alpha装饰器修改了ClassThree.method_y方法,因此执行three.method_y时运行inner_1函数的定义体。
  4. 程序结束时,绑定在全局变量one上的ClassOne实例会垃圾回收程序回收,执行了__del__方法。

场景2主要表明类装饰器可能对子类没有影响。示例中ClassFour定义为ClassThree的子类。ClassThree类上依附的@deco_alpha装饰器把method_y方法替换了,但是这对ClassFour类根本没有影响,但是如果ClassFour.method_y方法使用super()调用ClassThree.method_y方法,那么便会看到装饰器起作用,执行inner_1函数,综上,类装饰器究竟能不能影响到子类,关键看子类的具体实现。

四、元类基础知识

元类是用于构建类的类。根据python对象模型,类也是对象,因此类肯定是另外某个类的实例。默认情况下,python中的类是type类的实例,即type是大多数内置类和用户定义的类的元类。为了避免无限回溯,type是其自身的实例。

object类和type类之间的关系很神奇:object类是type类的实例,而type类是object类的子类。这种神奇的关系没办法用python代码表述,因为定义其中一个之前另一个必须存在。type是自身的实例这一点也很神奇。

        除了type,标准库中还有一些别的元类,例如ABCMeta和Enum,collections.Iterable是一个抽象类,也是ABCMeta类的实例,ABCMeta类又是type类的实例。所有类都直接或间接地是type的实例,不过只有元类同时也是type的子类,即元类从type类继承了构建类的能力。

 

 

所有类都直接或间接地是type的实例,但是元类还是type的子类,因此可以作为制造类的工厂。具体地说,元类可以通过实现__init__方法定制实例,元类的__init__方法可以做到类装饰器能做的任何事情,但作用更大。

场景练习 

 

场景3解答

  1.  创建ClassFive时调用了MetaAleph.__init__方法。
  2.  创建ClassFive的子类ClassSix时也调用了MetaAleph.__init__方法。

python解释器在计算ClassFive类的定义体时直接调用了MetaAleph类的__init__方法,其有四个参数:

  • cls,这是要初始化的类对象,例如这里的ClassFive。在编写元类时,通常把self参数改成cls,这样能清楚地表明要构建的实例是类。
  • name、bases、dic,与构建类时传给type的参数一样。

MetaAleph.__init__方法的定义体中定义了inner_2函数,然后将其绑定给cls.method_z。MetaAleph.__init__方法签名中的cls指代要创建的类(例如ClassFive),而inner_2函数签名中的self指代我们在创建的类的实例(例如ClassFive类的实例)。

场景4解答

  1. 装饰器依附到ClassThree类上之后,method_y方法被替换成inner_1方法。
  2. 虽然ClassFour是ClassThree的子类,但是没有依附装饰器的ClassFour类不受影响。
  3. MetaAleph类的__init__方法把ClassFive.method_z方法替换成inner_2函数。
  4. ClassFive的子类ClassSix也一样,method_z方法被替换成inner_2函数。

ClassSix类没有直接引用MetaAleph类,但是收到了影响,因为它是ClassFive的子类,进而也是MetaAleph类的实例,所以由MetaAleph.__init__方法初始化。

五、定制描述符的元类

  1. LineItem是model.Entity的子类。

model_v7模块中要定义一个元类,而model.Entity是元类的实例。

  1.  在超类type上调用__init__方法。
  2.  与上文中@entity装饰器逻辑一样。
  3. 这个类的存在是为了用起来便利:这个模块的用户直接继承Entity即可,无需关心EntityMeta元类,甚至不用知道它的存在。

 

 

六、元类的特殊方法__prepare__

某些应用中,可能需要知道类的属性(包括数据属性与方法)定义的顺序。

        type构造方法以及元类的__new__和__init__方法都会收到要计算的类的定义体,形式是名称到属性的映射,默认情况下该映射是字典。即,原来或类装饰器获取映射时,属性在类定义体中的顺序已经丢失了。

        该问题解决方法是python3引入的特殊方法__prepare__,该特殊方法只在元类中有用,且必须声明为类方法(@classmethod装饰器定义)。解释器调用元类的__new__方法之前会先调用__prepare__方法,使用类定义体中的属性创建映射。__prepare__方法的第一个参数是元类,第二个参数是要构建的类的名称,第三个参数是基类组成的元组,返回值必须是映射。元类构建新类时,__prepare__方法返回的映射会传给__new__方法的最后一个参数,然后再传给__init__方法。

  1.  返回一个空的OrderedDict实例,类属性将存储在里面。
  2.  在要构建的类中创建一个_field_names属性。
  3.  这里的attr_dict是OrderedDict对象,由解释器在调用__init__方法之前调用那个__prepare__方法时获得。因此这个for循环会按照添加属性的顺序迭代属性。
  4.  把找到的各个Validated字段添加到_field_names属性中。
  5. field_names类方法的作用就是按照添加字段的顺序产出字段的名称。

七、类作为对象

python数据模型为每个类定义了很多属性,常见的比如__mro__、__class__和__name__。

  • cls.__bases__,由类的基类组成的元素。
  • cls.__qualname__,类或函数的限定名称,即从模块的全局作用域到类的点分路径。
  • cls.__subclasses__(),返回一个列表,包含类的直接子类。这个方法的实现使用弱引用,防止在超类和子类之间出现循环引用。这个方法返回的列表中是内存里现存的子类。
  • cls.mro(),构建类时,如果需要获取储存在类属性__mro__中的超类元组,解释器会调用这个方法。元类可以覆盖这个方法,定制要构建的类解析方法的顺序。

 dir()函数不会列出本节提到的任何一个属性。

        

 

 

 

 

 

 

《Python学习手册第4版》PDF源代码+《流畅的Python》PDF思维导图 看到第38章了,整体感觉解释详细,例子丰富;关于Python语言本身的讲解全面详尽而又循序渐进不断重复,同时详述语言现象背后的机制和原理;除语言本身,还包含编程实践和设计以及高级主题。边看边写代码。不然看了会忘,也不会发现细节问题。边看边梳理总结。先看代码,再看文字解释。因为Python本来就是自说明,例子也好懂,所以这样干可以避免枯燥,加速阅读。循序渐进,重要的主题会渐进式呈现,并随后... 阅读详情

相关推荐

《流畅的python》读书笔记

《流畅的python》这本书值得推荐,认真读完2篇,对python的理解提高一大截。本书属于python进阶书,不适合入门读物。另外还有2本进阶书《python cookbook》和《Effective Python:编写高质量Python代码的59个有效方法》。下面是本书的读书笔记,其他2本后面陆续补充。

老兵Coding 1490

《Python高级编程》(六)类工厂

类工厂定义理解类工厂函数何时编写类工厂类属性与实例属性类方法的限制使用类工厂 定义 类工厂本质:类工厂就是一个在运行时创建类的函数。 即允许创建类时根据情况决定其属性,比如,根据用户输入创建属性。 类工厂函数:是一个用于创建并返回类的函数 理解类工厂函数 使用type创建类如下: def init(self, name): self.name = name def eat(self): ...

zhuix7788的专栏 855

压电阀控制器设计-总章

本文章用于回顾记录本人制作压电阀控制器的关键技术,本人所制作压电阀控制器已经上市得到应用,特在此对一些关键技术进行回顾记录,欢迎从事压电控制及压电阀相关人员一起讨论

qq_42712859的博客 849

Python类不为人知的秘密属性:__bases__、__qualname__与继承控制

掌握__bases__等特殊属性,将助你:✅ 深入理解Python类对象模型本质✅ 开发更灵活的动态编程框架✅ 高效调试复杂继承结构问题TIP:在IPython中尝试obj?查看对象完整特殊属性(比dir()更全面)

钢铁男儿 921

Windows环境下Elasticsearch与JDK版本兼容性实战指南

本文详细解析了Windows环境下Elasticsearch与JDK版本的兼容性问题,提供了从版本匹配检查到安装部署的完整实战指南。重点介绍了Elasticsearch 8.x需JDK 17+等关键版本对应关系,并分享多版本JDK共存方案及性能优化技巧,帮助开发者高效避坑。

weixin_29250403的博客 421

倍福ADS通讯协议深度解析——从握手到数据包的完整旅程

本文以工程师视角,通过Wireshark抓包实战,深度解析了倍福ADS通讯协议的完整工作流程。从TCP三次握手建立连接,到拆解AMS/TCP信封、AMS Header地址与命令解析,再到ADS Data读写请求的载荷构成,完整呈现了一次数据通讯的“旅程”。文章重点剖析了协议包格式,并结合实际案例,提供了基于协议分析的故障排查思路,帮助开发者深入理解并精准调试工业自动化系统通讯。

weixin_29231725的博客 151

Python 类的元编程-元类metaclass

元编程(Metaprogramming)是指编写可以操作、修改或生成代码的代码。在 Python 中,元编程是一种非常强大的工具,允许在运行时动态创建类、修改类的行为,甚至在代码执行过程中改变对象的结构。特别是在面向对象编程中,类的元编程提供了对类定义、继承和行为的精细控制。本文将深入探讨 Python 中的类的元编程,介绍类的元编程的基本概念、常见的元编程技术,以及如何通过元类(metaclass)来实现这些功能。

2069

智能驾驶感知模块的测试评估方法(上)

对于智能驾驶系统而言,感知模块是开发难度最大、投入资源最多的核心部分。在智能驾驶开发团队内部,感知模块需要独立进行评测才能及早发现潜在缺陷或判断性能是否有改进。随着近几年BEV、OCC、E2E等新技术方案被越来越多企业应用,感知的评测变得越来越艰难,效率也变得越来越低下。本文作者基于在智驾测试行业多年经验,试图总结感知评测的基本规律和效率提升方法,以供读者一些启发。

vincent_321的博客 2559

流畅的Python(二十一)-类元编程

历史将近4个月,《流畅的Python》完结撒花, 下一站《Python数据科学》,相距有时,后会有期。

weixin_37901366的博客 935

LVGL 蜂巢气泡菜单(Hex Menu)

h。

摸鱼专家 176

YOLOv11涨点改进| CVPR 2026 |独家创新首发、特征融合改进篇| 引入FAAFusion傅里叶角对准融合模块,促进高低频特征融合,增强模型在小目标、密集目标检测和旋转目标检测任务高效涨点

🔥本文提出FAAFusion傅里叶角对准融合模块,用于改进YOLOv11网络模型。该模块通过在特征金字塔融合阶段对齐高低层特征的方向信息,缓解传统FPN直接融合带来的方向冲突问题。FAAFusion利用傅里叶旋转等变性原理,在频域估计主方向并进行特征对齐,显著提升了多尺度特征表达的一致性与有效性。实验表明,该方法在DOTA等遥感数据集上取得了新的最先进水平,特别适用于旋转目标检测任务。文章详细介绍了模块原理、结构优势,并提供了三种不同的YOLOv11改进配置方案和完整的核心代码实现。

Ai缝合怪、助力小伙伴高效发论文 153

《流畅的Python》读书笔记25: 第五部分 元编程 - 类元编程

元类是深奥的黑魔法,99% 的用户永远不需要触及。如果你不确定是否需要,那就不需要。类元编程(Class Metaprogramming)是指在运行时创建或定制类的技术。Python 中实现类元编程的主要工具有:类装饰器、钩子和元类(metaclass)。本章是全书最后一章(第二版),将带领读者走进 Python 元编程的神秘殿堂,理解类创建的底层机制,并学习如何在不显式修改类定义的情况下动态改变类的行为。本章核心议题类创建流程type的构造过程,__new__和__init__在类创建中的角色。

3370

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 618

Python类元编程

什么是类元编程 类元编程是指动态地创建或定制类,也就是在运行时根据不同的条件生成符合要求的类,一般来说,类元编程的主要方式有类工厂函数,类装饰器和元类。 创建类的另一种方式 通常,我们都是使用 class 关键字来声明一个类,像这样: class A: name = 'A' 但是,我们还有另外一种方式来生成我们的类,下述代码与上面作用相同: A = type('A', (object,), {'name': 'A'}) 一般情况下我们把 type 视作函数,调用 type(obj) 来获取 ob

Assassin 482

2024全国村级行政边界数据

五级行政区划:村边界数据产品涵盖五级行政区划:(一级行政区)省级行政区共31个其中:(台湾、香港、澳门除外);(二级行政区)地级行政区共334个其中:7个地区、3个盟、30个自治州、294个地级市;(三级行政区)县级行政区共2851个其中:1355个县、117个自治县、49个旗、3个自治旗、363个县级市、962个市辖区、1个林区、1个特区;(四级行政区)乡级行政区共40497个其中:11626个乡、1034个民族乡、20117个镇、7566个街道、151个苏木、1个民族苏木、2个县辖区公所;

J_Giser的博客 3232

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

流畅的Python笔记

比如,要存放 1000 万个浮点数的话,数组(array)的效率要高得多,因为数组在背后存的并不是 float 对象,而是数字的机器翻译,也就是字节表述。构造方法或 [:] 做的是浅复制(即复制了最外层容器,副本中的元素是源容器中元素的引用)。综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定。注意,一般来说,深复制不是件简单的事。其实,闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。

ccnuacmhdu的博客 1085

SAP B1中文培訓教材_SDK

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

python元编程的书_Python类元编程

1. 什么是类元编程类元编程是指动态地创建或定制类,也就是在运行时根据不同的条件生成符合要求的类,一般来说,类元编程的主要方式有类工厂函数,类装饰器和元类。2. 创建类的另一种方式通常,我们都是使用 class 关键字来声明一个类,像这样:class A:name = 'A'但是,我们还有另外一种方式来生成类,下述代码与上面作用相同:A = type('A', (object,), {'name'...

weixin_31833039的博客 156

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《流畅的python》学习笔记及书评

《流畅的python》学习笔记 文章目录《流畅的python》学习笔记写在前面1. Python数据模型1.1 特殊方法2. 序列构成的数组2.1 内置序列类型2.2 列表推导和生成器表达式2.3 元组不仅仅是不可变的列表2.4 切片2.5 增量赋值2.6 排序2.7 数组、内存视图、NumPy和队列3. 字典和集合3.1 泛映射类型和字典推导3.2 常见的映射方法3.3 映射的弹性键查询3.4 字典的变种3.5 集合3.6 dict和set的背后4. 文本和字节序列4.1 字符和字节4.2 编码和解码4.

李英俊小朋友 2463

读书笔记:《流畅的Python》第21章 类元编程

# 第21章 类元编程 """ 类元编程指的是运行时创建或定制类的技艺 1.类是一等对象,任何时候都可以使用函数新建类,而无需使用class关键字 2.类装饰器也是函数,不过能够审查/修改/甚至把被装饰的类替换成其他类 3.元类功能强大,但难以掌握,类装饰器能用更简单的方式解决很多问题 """ # 21.1 类工厂函数 # collections.namedtuple: # 把一个类名和几个属性名传给这个函数,它会创建一个tuple的子类, # 其中的元素通过名.

Morbidmuse的博客 856

《流畅的Python》读书笔记01: 开启“流畅的Python”之旅

流畅的Python》()由巴西Python专家所著,豆瓣评分高达9.4分,是Python进阶领域的必读经典。由奋战在Python开发一线近20年的Luciano Ramalho执笔,Victor Stinner、Alex Martelli等Python大咖担纲技术审稿人,从语言设计层面剖析编程细节,兼顾Python 3和Python 2,告诉你Python中不亲自动手实践就无法理解的语言陷阱成因和解决之道,教你写出风格地道的Python代码。

2866

流畅的 Python 第二版(GPT 重译)(十三)

元类、类装饰器以及对以下方面很有用:子类注册子类结构验证将装饰器应用于多个方法对象序列化对象关系映射基于对象的持久性在类级别实现特殊方法实现其他语言中的类特性,比如特性和面向方面的编程在某些情况下,类元编程也可以帮助解决性能问题,通过在导入时执行通常在运行时重复执行的任务。最后,让我们回顾一下亚历克斯·马特利在他的文章“水禽和 ABC”中的最终建议:而且,不要。

龙哥盟 1997

流畅的python mobi 百度云_流畅的python【中文版】mobi下载

流畅的python中文版是一本关于python实战手册,本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。它可以用于kindle,本书由奋战在Python开发一线近20年的Lu...

weixin_39517902的博客 1534

流畅的Python笔记(下)

Python相关知识点准备 九、符合Python风格的对象 得益于Python的数据模型,自定义类型能够像Python内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子类型(duck type) ,前一章分析了Python对象的结构和行为,这一章则自己定义类,让定义的类像Python对象一样。 9.1 什么是散列表? 散列表(Hash table,也叫哈希表),是根据关键码值(Ke...

Za七杂⑧ 1551

【hacker送书第20期】流畅的Python(第2版)

本书是Python领域备受推崇的经典作品,致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,写出简洁、流畅、易读、易维护,并且地道的Python代码。本书着重讲解Python语言所独有的功能,助你成功进阶为Python高手。第2版与时俱进,教你跳出旧有经验,探索并运用地道的Python 3功能。第2版主体内容分为五部分:数据结构、函数即对象、类和协议、控制流、元编程。每一部分都精彩纷呈,通过丰富的示例和细致的讲解,教你充分利用Python特性,写出有效且现代的Python 3代码。

hacker707的博客 2万+

看流畅的python感觉有难度_《流畅的Python》读书笔记

第一部分:序幕第1章:Python数据模型通过实现特殊方法,自定义数据类型可以表现得和内置类型一样;__repr__方便调试和记录日志,__str__方便用户看;序列数据类型特殊方法使用最多;第二部分:数据结构第2章:序列构成的数组系列类型可分为 可变和不可变、扁平序列和容器序列;列表推导生成器表达式提供了灵活构建和初始化序列的方式;元组、切片、array.array、collections.de...

weixin_39580682的博客 234

python可以在多平台运行 体现了什么特性_《流畅的python》阅读笔记

起步《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了, 但往往由于够用让他们忘了深入, 去精通. 我们希望全面了解这个语言的能力边界, 可能一些高级的特性并不能马上掌握使用, 因此这本书是工作之余, 还有余力的人来阅读, 我这边就将其有用, 精妙的进阶内容整理出来.这本书有21个章节, 整理也是根...

weixin_39962153的博客 1675
上一篇: 流畅的python笔记(二十)属性描述符
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值