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 魔法函数 php】魔法函数python的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于魔法函数 php、魔法函数python的信息别忘了在本站进行查找喔 。
推荐阅读
- creo工程图转pdf,creo工程图转pdf线性怎样变细
- 平板视频为什么会黑边,平板看视频有黑边
- 休闲养成武侠游戏手游,休闲类武侠手游
- sqlserver2000删除日志,sqlserver日志文件删除
- c语言画折线函数图 c++画折线图
- asp.net毕业项目,asp_net课题总结
- 小圆点键盘怎么连电脑打,圆点键盘怎么打出来
- 阿曼达游戏冒险下载,阿曼达up主
- java打印弹出窗口代码 java页面点打印无反应