在类中有一些特殊的方法具有特殊的意义,比如__init__和__del__方法,它们的重要性我们已经学习过了。
一般说来,特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元组一样),那么你只需要实现__getitem__()方法就可以了。想一下,Python就是对list类这样做的!
下面这个表中列出了一些有用的特殊方法。如果你想要知道所有的特殊方法,你可以在《Python参考手册》中找到一个庞大的列表。
表15.1 一些特殊的方法
名称 |
说明 |
__init__(self,...) |
这个方法在新建对象恰好要被返回使用之前被调用。 |
__del__(self) |
恰好在对象要被删除之前调用。 |
__str__(self) |
在我们对对象使用print语句或是使用str()的时候调用。 |
__lt__(self,other) |
当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。 |
__getitem__(self,key) |
使用x[key]索引操作符的时候调用。 |
__len__(self) |
对序列对象使用内建的len()函数的时候调用。 |
l assert语句用来声明某个条件是真的并且在它非真的时候引发一个错误,那么assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError。
>>> mylist = ['item']
>>> assert len(mylist)>= 1
>>> mylist.pop()
'item'
>>> assert len(mylist)>= 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
l exec语句用来执行储存在字符串或文件中的Python语句。
>>>'print "Hello World"'
Hello World
l eval函数用来计算存储在字符串中的有效Python表达式
>>>eval('3*2')
6
l repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。
>>> i =[]
>>>i.append('item')
>>> `i`
"['item']"
>>>repr(i)
"['item']"
不像其他的类型,元组和字典类型做参数比较特殊,分别需要在参数名前加上*和**前缀。字典的例子就不举了:
#!/usr/bin/python def powersum(power, *args): '''Return the sum of each argument raised to specified power.''' total = 0 for i in args: total += pow(i, power) return total print powersum(2, 3, 4) print powersum(2, 10)
显示:
25
100
由于在args变量前有*前缀,所有多余的函数参数都会作为一个元组存储在args中。如果使用的是**前缀,多余的参数则会被认为是一个字典的键/值对。
lambda语句被用来创建新的函数对象,并且在运行时返回它们。
#!/usr/bin/python def make_repeater(n): return lambda s: s*n twice = make_repeater(2) print twice('word') print twice(5)
显示:
wordword
10
列表解析是对某个列表进行一些判断和处理生成一个新的列表:
>>>a = [1, 2, 3, 4]
>>>[u * 2 for u in a]
[2, 4, 6, 8]
>>>[u + 2 for u in a if u > 2]
[5, 6]
列表解析更像是把处理数据的语句提到整个语句最前面,例如第一个列表的解析可以写成:
x = []
for u in a:
x.append(u* 2)
第二个解析可以写成:
x = []
for u in a:
ifu > 2:
x.append(u+ 2)
怎么样,对比一下我们会发现这是一个非常方便的功能啊,在很多时候,我们都是使用循环来处理列表中的每一个元素,而使用列表综合可以用一种更加精确、简洁、清楚的方法完成相同的工作。