21-Python类机制的深度解析 全方位介绍Python中的魔法方法,一网打尽
21-Python类机制的深度解析: 全方位介绍Python中的魔法方法,一网打尽楔子下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法。也正因为如此,numpy才得以很好的实现。
那么Python中常见的魔法方法都有哪些呢?我们按照特征分成了几类,下面就来看看魔法方法都有哪些,然后再举例说明它们的用法。
魔法方法概览我们根据不同的特征分为了以下几类:
注意:有的方法是Python2中的,但是在Python3中依然存在,但是不推荐使用了。比如:__cmp__、__coerce__等等,我们就没有画在图中。
下面我们就来介绍一下上面的那些魔法方法的实际用途。
魔法方法介绍构建以及初始化__new__和__init__我们之前已经见识过了,还有一个__del__是做什么 呢?我们一起来看一下。
123456789101112131415161718192021class Girl: def __new__(cls, *args): print(" ...
20-Python类机制的深度解析:实例对象的创建、以及属性访问
20-Python类机制的深度解析(第四部分): 实例对象的创建、以及属性访问楔子介绍完类对象之后,我们来介绍实例对象。我们之前费了老鼻子劲将类对象剖析了一遍,但这仅仅是万里长征的第一步。因为Python虚拟机执行时,在内存中兴风作浪的是一个个的实例对象,而类对象只是幕后英雄。
通过class类对象创建实例对象我们还以之前的代码为例:
123456789101112131415class Girl: name = "夏色祭" def __init__(self): print("__init__") def f(self): print("f") def g(self, name): self.name = name print(self.name)girl = Girl()
看一下它的字节码,这里我们只看创建实例对象的字节码,也就是模块的字节码。
12345678910111213 1 0 LOAD_BUILD_CLASS ...
Where to Start Studying Type Annotation Practices in Python
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fbc64ced270df111e45ce10c71ebeb328a3c7da65366e3cb991bae8994ae8d02c0d0f157b414f94a74e8880e7b81a74aac3b82cc18f2553f7f3b469daa473363a66a53bf10d55b5b34185a7194d836b7b0c8e6e176fd874d3712341b7148dd726bfe4f54f455ba6d1076ed33f0d8bd68d749bb2f435d30152c001491107f80c8f0d1940222deb4fdbf6c2f938898660fa46d7a7df48ef22e6ff3757786c164378371b99c442b375fa34f49ad57faf7d9d98ad032ffd6ca4d157fb0c122655c5ed51bffa6a2c506b7adc2e8e300b7213a4db74a51c462b0e51e8 ...
Static Type Inference for Foreign Functions of Python
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb13421448a5d79f3403a0b188d7e84076afa8b7ac4c55d8a318940870533929874de96ccbbec1b9b79b8c66ea7ccbad221a1a61d8eb521ff0ed356f4e0addd94c07c7a1114175bab5ac67c40e196961ad16b22328f6ce80f87c22e04ace8f051e137491da6b494a4712628c906ad76521c7194aa302a7a1574370e3b86654842b012e5f4ca9751cf985d00efd6fe4431d8aa70453e965dfecc17b20b88addad448d9cbb07589ff9c8d03574613838c6df17aa195ebae62e070124bbde14a001763ac9fda77b2331a4de6bced5f4a58b6f4580e53439d8b18ea ...
What the Fork Finding Hidden Code Clones in npm
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb5148402a397e2d2b625f9857147c1a10ab4ed15488bff296aae09ef4040afa37bacd23f9bfe8f9679b506d15e85f61626eb318498197801eb02c54320e921746b585b06839bf6875de0bb56e0c94b3df22c3a3b4468bcbc68dbfee0474289f56d5f807039a737454e0d880ad8e50655a8c5e249fe240b4be1c14d275aa955afef2ebc90c255ead2f8265d620dd45ad1ebe5eb4f3a0a5fd1486f598ac20bc850eb5cd8ef667fe01d50c9ca8c9a118ee1d92e6e46cf870d0e2594f8a383fc41d2c1e56ca445adf306eed77fd4144d029975d3e5a7e401b5c2cb ...
19-Python类机制深度解析:自定义类的底层实现以及Metaclass
19-Python类机制深度解析:自定义类的底层实现以及metaclass楔子Python除了给我提供了很多的类之外,还支持我们定义属于自己的类,那么Python底层是如何做的呢?我们下面就来看看。
自定义class老规矩,如果想知道底层是怎么做的,那么就必须要通过观察字节码来实现。
12345678910111213141516171819202122class Girl: name = "夏色祭" def __init__(self): print("__init__") def f(self): print("f") def g(self, name): self.name = name print(self.name)girl = Girl()girl.f()girl.g("神乐mea")"""__init__f神乐mea"""
通过之前对函数机制的分析中,我 ...
18-Python类机制深度解析-类的多继承与属性查找
18-Python类机制深度解析-类的多继承与属性查找楔子这次我们来看一下Python中类的继承与属性查找机制,我们说Python是支持类的多继承的,在查找属性的时候会沿着继承链不断找下去。那么下面我们就来深入地考察一下类的继承与属性查找在底层是如何实现的。
深入class我们知道Python里面有很多以双下划线开头、双下划线结尾的方法,我们称之为魔法方法。Python中的每一个操作符,都被抽象成了一个魔法方法。比如整数3,整数可以相减,这就代表int这个类里面肯定定义了__sub__函数。字符串不能相减,代表str这个类里面没有__sub__函数;而整数和字符串都可以执行加法操作,显然int、str内部都定义了__add__函数。
123456789class MyInt(int): def __sub__(self, other): return int.__sub__(self, other) * 3a = MyInt(4)b = MyInt(1)print(a - b) # 9
我们自己实现了一个类,继承自int。当我执行a - b的时候,肯定执行对应 ...
17-Python类机制深度解析-回顾Python中的对象模型
17-Python类机制深度解析-回顾Python中的对象模型楔子这一次我们就来看看Python中类是怎么实现的,我们知道C不是一个面向对 象语言,而Python却是一个面向对象的语言,那么在Python的底层,是如何使用C来支持Python实现面向对象的功能呢?带着这些疑问,我们下面开始剖析python中类的实现机制。另外,在Python2中存在着经典类(classic class)和新式类(new style class),但是到Python3中,经典类已经消失了。并且python2官方都不维护了,因此我们这一章只会介绍新式类。
另外关于类,我们在最开始介绍对象关系模型的时候其实说了不少,这里会再简单温习一遍。
Python中的对象模型我们在最开始介绍对象的时候就说了,在面向对象的理论中,有两个核心的概念:类和实例。类可以看成是一个模板,那么实例就是根据这个模板创建出来的对象。可以想象成docker的镜像和容器。但是在Python中,一切都是对象,所以类和实例都是对象,类叫做类对象,实例叫做实例对象。如果想用大白话来描述清楚的话,这无疑是一场灾难,我们还是需要使用一些专业术语来描 ...
Flexible and Optimal Dependency Management via Max-SMT
d9eba399523fe401e434f6396d459a7a735596707e1aa1664e34b3a934e193fb66dbe0c4d51c9fa69a2536673e082387beb384fc7e9571a45b05dab4bae28e3ad02fa6f5716c76f86441d9d3e9212ed02f37f468158990dbd3000d277ebb3c54fa6fd04ea66b7013e588a75bff24eabd4d58fd399d719b92f34af838af0594936b1307ae443c5be9f4441cb6a316759f5363fe2c4065308fecac3c894e8afc373c4848938963bde828dfb265f2c4e86920acf7fef5b8260bfe96c683a382888a4b7b2b4f5127bb8302b4e8b37d30bcae841f09babec778ef1be3c878fc88c4bc0ac3be8f66012bb885ac55d65cafe25bd5656bcb283b5dfe7 ...
16-闭包的底层实现
16-闭包的底层实现以及调用楔子上一篇我们看了函数是如何调用的,这一次我们看一下函数中局部变量的访问、以及闭包相关的知识。
函数中局部变量的访问我们说过函数的参数和函数内部定义的变量都属于局部变量,所以它也一样是通过静态的方式进行访问。
123456789101112131415161718192021222324252627x = 123def foo(): global x a = 1 b = 2# a和b是局部变量,x是全局变量,因此是2print(foo.__code__.co_nlocals) # 2def bar(a, b): passprint(bar.__code__.co_nlocals) # 2def bar2(a, b): a = 1 b = 2 c = 3print(bar2.__code__.co_nlocals) # 3
因此我们看到,无论是参数还是内部新创建的变量,本质上都是局部变量。并且我们发现如果函数内部定义的变量如果和函数参数一致,那么参数就没用了,很好理解,因为本质上就相当于重新赋值罢了,此时外面无 ...