方法 | 重载 | 调用 |
---|---|---|
__init__ | 构造函数 | 对象建立:X = Class(args) |
__del__ | 析构函数 | X对象收回 |
__repr__,__str__ | 打印、装换 | print(x),repr(x),str(x) |
__add__ | 运算符+ | 如果没有__iadd__,X+Y,X+=Y |
__call__ | 函数调用 | X(args,*kwargs) |
__getattr__ | 点号运算 | X.undefined(拦截没有定义的属性) |
__setattr__ | 属性赋值语句 | X.any = value(拦截赋值语句,注意避免循环) |
__delattr__ | 属性删除 | del X.any |
__getattribute__ | 属性获取 | X.any(拦截所有属性) |
__getitem__ | 索引运算 | X[key],X[i:j],没有__iter__时的for循环和其他迭代器 |
__setitem__ | 索引赋值语句 | x[key]=value,x[i:j]=sequence |
__delitem__ | 索引和分片删除 | del x[key],del x[i:j] |
__len__ | 长度 | len(x) |
__iter__,__next__ | 迭代环境 | I = iter(x),next(I) |
__contains__ | 成员关系测试 | item in X(任何可迭代的) |
__index__ | 整数值 | hex(x),bin(x) |
__enter__,__exit__ | 环境管理器 | with obj as var: |
__get__,__set__,__delete__ | 描述符属性 | X.attr,X.attr = value,del X.attr |
__new__ | 创建 | 在__init__之前创建对象 |
call表达式:__call__(注意不是拦截构造函数)
<pre>
class Callee:
def __call__(self,args,*kwargs):
print('Called:',args,kwargs)
c = Callee()
c(1,2,3)
Called:(1,2,3){}
c(1,2,3,x=4,y=5)
Called:(1,2,3){'y':5,'x':4}
</pre>
索引和分片__getitem__和__setitem__
如果在类中定义了的话,则对于实例的索引运算会自动调用_\getitem__。当实例x出现x[i]这样的索引运算时,会调用__getitem__。
<pre>
--coding:UTF-8--
class Indexer:
def __getitem__(self,index):
return index**2
if __name__ == '__main__':
x = Indexer()
print(x[2])
4
</pre>
除了索引分片表达式也调用__getitem__,内置类型以同样的方式处理分片
<pre>
class Indexer:
data = [5,6,7,8,9]
def __getitem__(self,index):
print('getitem:',index)
return self.data[index]
if __name__ == '__main__':
x = Indexer()
print(x[2:4])
getitem: slice(2, 4, None) #这里存在一个分片对象
[7, 8]
</pre>