Python魔法方法(magic method)细解几个常用魔法方法(下)
接上文,再介绍最后几个常用的魔法方法。
关于__dict__:
先上个例子:
class Test(object):fly = Truedef __init__(self, age):self.age = age
__dict__魔法方法可以被称为系统,他是存储各分层属性的魔法方法。__dict__中,键为属性名,值为属性本身。可以这样理解,在平时我们给类和实例定义的那些属性,都会被存储到__dict__方法中用于读取。而我们平时使用的类似这样的语法Test.fly 其实就是调用了类属性,同样可以写成Test.__dict__['fly']。除了类属性,还有实例属性。当我们用类实例化一个实例,例如上文我们使用p = Test(2)实例化类Test,p也会具有__dict__属性。这里会输出:
{'age': 2}
由上可以发现,python中的属性是进行分层定义的。/object/Test/p这样一层一层下来的。当我们需要调用某个属性的时候,python会一层一层往上面遍历上去。先从实例,然后实例的__class__的__dict__,然后是该类的__base__。这样__dict__一路找上去。如果最后都没有找到,就抛出AttributeError错误。
这里可以延伸一下,没记错的话,我前面有篇文章讲了一个方法__slot__。__slots__方法就是通过限制__dict__,只让类实例初始化__slots__里面定义的属性,而且让实例不再拥有__dict__方法,来达到节约内存的目的。我将会就上面的那个例子重写一下,来说明这个问题。
class Test(object):__slots__ = ['age']fly = Truedef __init__(self, age):self.age = age
output:
In [25]: Test.__dict__ Out[25]: dict_proxy({'__doc__': None,'__init__': <function __main__.__init__>,'__module__': '__main__','__slots__': ['age'],'age': <member 'age' of 'Test' objects>,'fly': True})In [36]: p.__dict__ --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-36-3a1cec47d020> in <module>() ----> 1 p.__dict__AttributeError: 'Test' object has no attribute '__dict__'In [37]: p.age Out[37]: 3In [38]: p.fly Out[38]: True
可以看到,__slots__方法并没有阻止由下至上的属性查找方法,只是不会再允许没有包含在__slots__数组中的属性再被赋值给实例了。但这并不妨碍,继续调用允许访问的属性,以及类属性。
关于__get__, __set__, __del__:
在前面的文章里面我也介绍过这三个魔法方法,虽然一般是用不到的,但是在写库的时候它们有特别的用途。他们是python另外一个协议descriptor的根基。
同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。在这种环境下面__dict__方法就无法办到。因为__dict__方法只能用来存储静态属性。python提供了多种即时生成属性的方法。其中一种就是property。property是特殊的属性。比如我们为上面的例子增加一个property特性,使得他能够动态变化。来看这个例子:
class Test(object):fly = Truedef __init__(self, age):self.age = agedef whether_fly(self):if self.age <= 30:return Trueelse:return Falsedef just_try_try(self, other):passwhether_fly = property(whether_fly)p = Test(20) print p.age print p.whether_fly p.age = 40 print p.age print p.whether_fly
output:
20 True 40 False
可以看到 我们可以使用这种手段,动态修改属性值。property有四个参数。前三个参数为函数,分别用于处理查询特性、修改特性、删除特性。最后一个参数为特性的文档,可以为一个字符串,起说明作用。这里我只是要到了第一个参数,查询的时候动态修改他的返回值,而第二个参数是在修改值的时候就会体现出来。
Reference:
http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html
Python魔法方法(magic method)细解几个常用魔法方法(下)相关推荐
- python中常见的魔法方法 magic method
魔法方法 magic method(类中定义的双下方法) 魔法方法都是父类object有的,在python3中所有的类默认都会继承object.当我们对这个对象使用这些函数或者运算符时就会调用类中的对 ...
- python的魔法方法(magic method)
1,什么是魔法方法 对象中前后都有双下划线修饰的方法中大部分是有特殊意义的,在这样的名称中很大一部分是魔法(特殊)方法的名称,如__future__. 如果你的对象实现(重载)了这些方法中的某一个,那 ...
- 介绍Python的魔术方法 - Magic Method
前言 在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__. 有些魔术方法,我们可能以后一辈子都不会再遇到了,这里也就只是简单 ...
- 详解DNS的常用记录(下):DNS系列之三
详解DNS常用记录(下) 在上篇博文中我们介绍了DNS服务器中几种不可或缺的记录,包括A记录,NS记录和SOA记录.本篇博文中我们将继续为大家介绍DNS ...
- 用户操作计算机的方法,操作者向计算机输入信息最常用的方法是(B).doc
操作者向计算机输入信息最常用的方法是(B). A.用文字 B.用键盘 C.用语言 D.用扫描仪 软盘加上写保护后,对它可以进行的操作是(A). A.只能读盘,不能写盘 B.既可读盘,又可写盘 C.只能 ...
- python dataframe loc函数_详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)...
在操作DataFrame时,肯定会经常用到loc,iloc,at等函数,各个函数看起来差不多,但是还是有很多区别的,我们一起来看下吧. 首先,还是列出一个我们用的DataFrame,注意index一列 ...
- python基础教程:统计计数的4种常用的方法
以下实例展示了 count() 方法的使用方法: T = (123, 'Google', 'Runoob', 'Taobao', 123);print ("123 元素个数 : " ...
- 详解3种常用数据分析方法,满足你职场95%的高频需求
最近有一位刚入行的朋友跟我吐槽,说他提交了一份8月的经营数据分析报告给领导,报告里面放了很多图表,也罗列了很多数据,结果却被老板痛批了一顿,说分析了半天也看不懂他的分析逻辑在哪里,他觉得很委屈. 其实 ...
- Python基础:面向对象基础 (一) 类及其属性和魔法方法
定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表# 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Hero ...
最新文章
- 存储能否导致ESXi网络性能问题?
- 余承东:国内用华为P40 Pro+就能拍照测体温,还很精准
- 计算机视觉与图像处理相关的国内外重要期刊汇总
- 辰星计划2021 | 旷视春季实习生招募—空中宣讲会第二弹来了!
- UNITY关于阴影打开关闭的设置
- ios的Navigation Controller的学习使用
- 使用docker搭建视频流服务器
- Android使用TextToSpeech(TTS)实现文字转语音合成播放
- 加权平均数的例子_加权平均数定义和实例
- OpenCV中的图像处理 —— 轮廓入门+轮廓特征
- 地理信息系统GIS基础知识
- linux磁盘配额步骤,Linux磁盘配额设置及使用
- CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件
- STL(五)之智能指针剖析
- 自学C语言的最大难题是什么?
- Oracle11g for Windows
- 互联网金融竞品分析:点融网、金蛋理财、懒投资(求指点 )
- Anaconda的安装
- 解决创客学院小黄书的错
- 读崔玉涛-直面小儿发热