方法 | 重載 | 調(diào)用 |
---|---|---|
__init__ | 構(gòu)造函數(shù) | 對(duì)象建立:X = Class(args) |
__del__ | 析構(gòu)函數(shù) | X對(duì)象收回 |
__repr__,__str__ | 打印性穿、裝換 | print(x),repr(x),str(x) |
__add__ | 運(yùn)算符+ | 如果沒(méi)有__iadd__,X+Y,X+=Y |
__call__ | 函數(shù)調(diào)用 | X(args,*kwargs) |
__getattr__ | 點(diǎn)號(hào)運(yùn)算 | X.undefined(攔截沒(méi)有定義的屬性) |
__setattr__ | 屬性賦值語(yǔ)句 | X.any = value(攔截賦值語(yǔ)句框都,注意避免循環(huán)) |
__delattr__ | 屬性刪除 | del X.any |
__getattribute__ | 屬性獲取 | X.any(攔截所有屬性) |
__getitem__ | 索引運(yùn)算 | X[key],X[i:j],沒(méi)有__iter__時(shí)的for循環(huán)和其他迭代器 |
__setitem__ | 索引賦值語(yǔ)句 | x[key]=value,x[i:j]=sequence |
__delitem__ | 索引和分片刪除 | del x[key],del x[i:j] |
__len__ | 長(zhǎng)度 | len(x) |
__iter__,__next__ | 迭代環(huán)境 | I = iter(x),next(I) |
__contains__ | 成員關(guān)系測(cè)試 | item in X(任何可迭代的) |
__index__ | 整數(shù)值 | hex(x),bin(x) |
__enter__,__exit__ | 環(huán)境管理器 | with obj as var: |
__get__,__set__,__delete__ | 描述符屬性 | X.attr,X.attr = value,del X.attr |
__new__ | 創(chuàng)建 | 在__init__之前創(chuàng)建對(duì)象 |
call表達(dá)式:__call__(注意不是攔截構(gòu)造函數(shù))
<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__
如果在類(lèi)中定義了的話(huà),則對(duì)于實(shí)例的索引運(yùn)算會(huì)自動(dòng)調(diào)用_\getitem__。當(dāng)實(shí)例x出現(xiàn)x[i]這樣的索引運(yùn)算時(shí),會(huì)調(diào)用__getitem__。
<pre>
--coding:UTF-8--
class Indexer:
def __getitem__(self,index):
return index**2
if __name__ == '__main__':
x = Indexer()
print(x[2])
4
</pre>
除了索引分片表達(dá)式也調(diào)用__getitem__,內(nèi)置類(lèi)型以同樣的方式處理分片
<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) #這里存在一個(gè)分片對(duì)象
[7, 8]
</pre>