接上文,再介绍最后几个常用的魔法方法。

关于__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)细解几个常用魔法方法(下)相关推荐

  1. python中常见的魔法方法 magic method

    魔法方法 magic method(类中定义的双下方法) 魔法方法都是父类object有的,在python3中所有的类默认都会继承object.当我们对这个对象使用这些函数或者运算符时就会调用类中的对 ...

  2. python的魔法方法(magic method)

    1,什么是魔法方法 对象中前后都有双下划线修饰的方法中大部分是有特殊意义的,在这样的名称中很大一部分是魔法(特殊)方法的名称,如__future__. 如果你的对象实现(重载)了这些方法中的某一个,那 ...

  3. 介绍Python的魔术方法 - Magic Method

    前言 在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__. 有些魔术方法,我们可能以后一辈子都不会再遇到了,这里也就只是简单 ...

  4. 详解DNS的常用记录(下):DNS系列之三

                            详解DNS常用记录(下) 在上篇博文中我们介绍了DNS服务器中几种不可或缺的记录,包括A记录,NS记录和SOA记录.本篇博文中我们将继续为大家介绍DNS ...

  5. 用户操作计算机的方法,操作者向计算机输入信息最常用的方法是(B).doc

    操作者向计算机输入信息最常用的方法是(B). A.用文字 B.用键盘 C.用语言 D.用扫描仪 软盘加上写保护后,对它可以进行的操作是(A). A.只能读盘,不能写盘 B.既可读盘,又可写盘 C.只能 ...

  6. python dataframe loc函数_详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)...

    在操作DataFrame时,肯定会经常用到loc,iloc,at等函数,各个函数看起来差不多,但是还是有很多区别的,我们一起来看下吧. 首先,还是列出一个我们用的DataFrame,注意index一列 ...

  7. python基础教程:统计计数的4种常用的方法

    以下实例展示了 count() 方法的使用方法: T = (123, 'Google', 'Runoob', 'Taobao', 123);print ("123 元素个数 : " ...

  8. 详解3种常用数据分析方法,满足你职场95%的高频需求

    最近有一位刚入行的朋友跟我吐槽,说他提交了一份8月的经营数据分析报告给领导,报告里面放了很多图表,也罗列了很多数据,结果却被老板痛批了一顿,说分析了半天也看不懂他的分析逻辑在哪里,他觉得很委屈. 其实 ...

  9. Python基础:面向对象基础 (一) 类及其属性和魔法方法

    定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表# 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Hero ...

最新文章

  1. 存储能否导致ESXi网络性能问题?
  2. 余承东:国内用华为P40 Pro+就能拍照测体温,还很精准
  3. 计算机视觉与图像处理相关的国内外重要期刊汇总
  4. 辰星计划2021 | 旷视春季实习生招募—空中宣讲会第二弹来了!
  5. UNITY关于阴影打开关闭的设置
  6. ios的Navigation Controller的学习使用
  7. 使用docker搭建视频流服务器
  8. Android使用TextToSpeech(TTS)实现文字转语音合成播放
  9. 加权平均数的例子_加权平均数定义和实例
  10. OpenCV中的图像处理 —— 轮廓入门+轮廓特征
  11. 地理信息系统GIS基础知识
  12. linux磁盘配额步骤,Linux磁盘配额设置及使用
  13. CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件
  14. STL(五)之智能指针剖析
  15. 自学C语言的最大难题是什么?
  16. Oracle11g for Windows
  17. 互联网金融竞品分析:点融网、金蛋理财、懒投资(求指点 )
  18. Anaconda的安装
  19. 解决创客学院小黄书的错
  20. 读崔玉涛-直面小儿发热

热门文章

  1. 如何生成16位流水号
  2. redis10--主从模式
  3. 《CLR via C#》之线程处理——线程池与任务
  4. 我的angularjs源码学习之旅1——初识angularjs
  5. Browser增加下载路径选择功能
  6. ubuntu 在vm中如何上网及注意问题
  7. IOC容器特性注入第四篇:容器初始化
  8. JAVA8新特性Optional和Stream和Localdate用法
  9. SpringBoot集成MyBatis-Plus框架
  10. qt 工作流_助力提升企业生产力-工作流管理