代码改变世界

[python]魔术方法

2014-06-10 22:56  阿普的博客  阅读(574)  评论(0)    收藏  举报

一、初始化

1、__new__方法,初始化过程中第一个用到的方法(用处不大)。

2、之后,__init__方法,构造方法。

3、最后,在对象回收时,调用__del__方法。如果解释器退出时,对象还存在,则不能保证__del__能够执行。

二、比较

__cmp__(self, other) 定义了比较的行为。

__eq__(self, other) 定义了等号的行为, == 。

__ne__(self, other) 定义了不等号的行为, != 。

__lt__(self, other) 定义了小于号的行为, < 。

__gt__(self, other) 定义了大于等于号的行为, >= 。

 1 class Word(str):
 2 '''存储单词的类,定义比较单词的几种方法'''
 3 
 4     def __gt__(self, other):
 5         return len(self) > len(other)
 6     def __lt__(self, other):
 7         return len(self) < len(other)
 8     def __ge__(self, other):
 9         return len(self) >= len(other)
10     def __le__(self, other):
11         return len(self) <= len(other)

三、运算符

1、一元运算符:正/负/abs(绝对值)/~(取反)

2、普通运算符:加减乘除/取模/指数/与或等都有对应的魔术方法,以及反运算方法。

四、类型转换

__int__(self)实现整型的强制转换。

五、表现你的类

__str__(self)定义了str()调用的时候的返回值,人类可读。

__repr__(self)定义了repr()调用的时候的返回值,机器可读。

__unicode__(self)定义了unicode()调用的时候的返回值,与str()类似。

__hash__(self)定义了当hash()调用的时候的返回值,它返回一个整型,用来在字典中快速比较。

__nozero__(self)定义了bool()调用时候的返回值。

六、控制属性访问

 __getattr__(self, name) 可以定义当用户试图获取一个不存在属性时的行为。适用于对普通拼写错误的获取和重定向。

__setattribute__(self, name) 可以定义当用户获取属性时的行为。

__setattr__(self, name) 可以定义当用户设置属性时的行为。

__delattr__(self, name) 可以定义当用户删除属性时的行为。

七、序列

 1 class FunctionalList:
 2     '''一个封装了一些附加魔术方法比如 head, tail, init, last, drop, 和take的列表类。
 3     '''
 4 
 5     def __init__(self, values=None):
 6         if values is None:
 7             self.values = []
 8         else:
 9             self.values = values
10 
11         def __len__(self):
12             return len(self.values)
13 
14         def __getitem__(self, key):
15         #如果键的类型或者值无效,列表值将会抛出错误
16             return self.values[key]
17 
18         def __setitem__(self, key, value):
19             self.values[key] = value
20 
21         def __delitem__(self, key):
22             del self.values[key]
23 
24         def __iter__(self):
25             return iter(self.values)
26 
27         def __reversed__(self):
28             return reversed(self.values)
29 
30         def append(self, value):
31             self.values.append(value)
32         def head(self):
33             return self.values[0]
34         def tail(self):
35             return self.values[1:]
36         def init(self):
37             #返回一直到末尾的所有元素
38             return self.values[:-1]
39         def last(self):
40             #返回末尾元素
41             return self.values[-1]
42         def drop(self, n):
43             #返回除前n个外的所有元素
44             return self.values[n:]
45         def take(self, n):
46             #返回前n个元素
47             return self.values[:n]

八、反射

isinstance()对应于__instancecheck__(self, instance)

issubclass()对应于__subclasscheck__(self, instance)

九、可以调用的对象__call__(self, args),主要用于改变实例的状态。

十、会话管理,__enter__和__exit__

十一、序列化对象