python魔法函数大全 python魔术方法call( 二 )


我们重写了__add__方法,当Python识别"+"操作时 , 会自动调用重写后的__add__方法 。可以看到,魔法方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写 。使用魔法方法 , 我们可以非常方便地给类添加特殊的功能 。
1、构造与初始化
__ new __、__ init __这两个魔法方法常用于对类的初始化操作 。上面我们创建a1 = A("hello")时,但首先调用的是__ new __;初始化一个类分为两步:
a.调用该类的new方法,返回该类的实例对象
b.调用该类的init方法,对实例对象进行初始化 。
__new__ (cls, *args, **kwargs)至少需要一个cls参数 , 代表传入的类 。后面两个参数传递给__ init __。在__ new __可以决定是否继续调用__ init __方法,只有当__ new __返回了当前类cls的实例 , 才会接着调用__ init __。结合__ new __方法的特性,我们可以通过重写__ new __方法实现Python的单例模式:
可以看到虽然创建了两个对象 , 但两个对象的地址相同 。
2、控制属性访问这类魔法
方法主要对对象的属性进行访问、定义、修改时起作用 。主要有:
__getattr__(self, name): 定义当用户试图获取一个属性时的行为 。
__getattribute__(self, name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性 , 若不存在,接着去调用getattr) 。
__setattr__(self, name, value):定义当一个属性被设置时的行为 。
当初始化属性时如self.a=a时或修改实例属性如ins.a=1时本质时调用魔法方法self.__ setattr __(name,values);当实例访问某个属性如ins.a本质是调用魔法方法a.__ getattr __(name)
3、容器类操作
有一些方法可以让我们自己定义自己的容器,就像Python内置的List,Tuple,Dict等等;容器分为可变容器和不可变容器 。
如果自定义一个不可变容器的话,只能定义__ len__ 和__ getitem__ ;定义一个可变容器除了不可变容器的所有魔法方法,还需要定义__ setitem__ 和__ delitem__ ;如果容器可迭代 。还需要定义__ iter __ 。
__len__(self):返回容器的长度
__getitem__(self,key):当需要执行self[key]的方式去调用容器中的对象,调用的是该方法
__setitem__(self,key,value):当需要执行self[key] = value时,调用的是该方法
__iter__(self):当容器可以执行 for x in container:,或者使用iter(container)时,需要定义该方法
下面举一个例子,实现一个容器 , 该容器有List的一般功能,同时增加一些其它功能如访问第一个元素,最后一个元素,记录每个元素被访问的次数等 。
这类方法的使用场景主要在你需要定义一个满足需求的容器类数据结构时会用到,比如可以尝试自定义实现树结构、链表等数据结构(在collections中均已有) , 或者项目中需要定制的一些容器类型 。
魔法方法在Python代码中能够简化代码 , 提高代码可读性 , 在常见的Python第三方库中可以看到很多对于魔法方法的运用 。
因此当前这篇文章仅是抛砖引玉,真正的使用需要在开源的优秀源码中以及自身的工程实践中不断加深理解并合适应用 。
Python的函数都有哪些?Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 。
函数能提高应用的模块性 , 和代码的重复利用率 。你已经知道Python提供了许多内建函数 , 比如print() 。但你也可以自己创建函数,这被叫做用户自定义函数 。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:

推荐阅读