特殊的方法
在类中有一些特殊的方法具有特殊的意义,比如__init__
和__del__
方法,它们的重要性我们已经学习过了。
一般说来,特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]
这样的索引操作(就像列表和元组一样),那么你只需要实现__getitem__()
方法就可以了。想一下,Python就是对list
类这样做的!
名称 | 说明 |
---|---|
__init__(self,...) | 这个方法在新建对象恰好要被返回使用之前被调用。 |
__del__(self) | 恰好在对象要被删除之前调用。 |
__str__(self) | 在我们对对象使用print 语句或是使用str() 的时候调用。 |
__lt__(self,other) | 当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。 |
__getitem__(self,key) | 使用x[key] 索引操作符的时候调用。 |
__len__(self) | 对序列对象使用内建的len() 函数的时候调用。 |
列表综合
通过列表综合,可以从一个已有的列表导出一个新的列表。例如,你有一个数的列表,而你想要得到一个对应的列表,使其中所有大于2的数都是原来的2倍。对于这种应用,列表综合是最理想的方法。
>>> a=[2,3,4,5]
>>> b=[2*i for i in a if i>2]
>>> print b
[6, 8, 10]
在函数中接收元组和列表
当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用*
和**
前缀。
由于在args
变量前有*
前缀,所有多余的函数参数都会作为一个元组存储在args
中。如果使用的是**
前缀,多余的参数则会被认为是一个字典的键/值对。
>>> def say(*a):
b=()
for i in range(0,len(a)):
print a[i],
>>> say(2,3,4)
2 3 4
>>> def say(*a):
print a
>>> say(2,3,4)
(2, 3, 4)
lambda形式
lambda
语句被用来创建新的函数对象,并且在运行时返回该函数
>>> def say(n):
return lambda s:s*n
>>> func=say(2) 运行say()时返回了lambda创建的新函数s:s*2给func,此时func就是一个函数,其参数是s 计算的是s*2
>>> print func
<function <lambda> at 0x00B5D1B0>
>>> print func(5)
10
exec语句与eval语句
exec
语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec
语句执行这些语句。
>>> exec "print func(5)" 接上面的lambda形式
10
eval
语句用来计算存储在字符串中的有效Python表达式。
>>> eval("6>5")
True
assert语句
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
repr函数
repr
函数用来取得对象的规范字符串表示。你可以通过定义类的__repr__
方法来控制你的对象在被repr
函数调用的时候返回的内容。
>>> a={'1':1,'2':2,'3':3}
>>> repr(a)
"{'1': 1, '3': 3, '2': 2}"