1. 類的屬性相關操作:
__setattr__、__getattr__、__delattr__、__setitem__、__getitem__、__delitem__
#coding=utf-8
'''
Created on 2015-8-27
@author: xhw
@explain: 屬性相關
'''
'''使用super可以調用父類的方法,或重寫前的內置方法'''
class Test(object):
def __init__(self):
self.A = "aa"
self['B'] = "BB"
self.C = "CC"
self['D'] = "DD"
del self.C
del self['D']
"------------------------------------------------------------------------------"
"----------------------attr:使用 '.' 的方式操作屬性時被調用-----------------------"
"------------------------------------------------------------------------------"
def __setattr__(self,name,value):
'''
@summary: 每當屬性被賦值的時候都會調用該方法,因此不能再該方法內賦值 self.name = value 會死循環
'''
print "__setattr__:Set %s Value %s"%(name,value)
self.__dict__[name] = value
def __getattr__(self,name):
'''
@summary: 當訪問不存在的屬性時會調用該方法
'''
print "__getattr__:No attribute named '%s'"%name
return None
def __delattr__(self,name):
'''
@summary: 當刪除屬性時調用該方法
'''
print "__delattr__:Delect attribute '%s'"%name
del self.__dict__[name]
print self.__dict__
"------------------------------------------------------------------------------"
"--------------------item:使用 [''] 的方式操作屬性時被調用-------------------------"
"------------------------------------------------------------------------------"
def __setitem__(self,name,value):
'''
@summary: 每當屬性被賦值的時候都會調用該方法,因此不能再該方法內賦值 self.name = value 會死循環
'''
print "__setitem__:Set %s Value %s"%(name,value)
self.__dict__[name] = value
def __getitem__(self,name):
'''
@summary: 當訪問不存在的屬性時會調用該方法
'''
print "__getitem__:No attribute named '%s'"%name
return None
def __delitem__(self,name):
'''
@summary: 當刪除屬性時調用該方法
'''
print "__delitem__:Delect attribute '%s'"%name
del self.__dict__[name]
print self.__dict__
if __name__ == "__main__":
A = Test()
a = A.aa
b = A['bb']
2. __len__、__iter__、__reversed__、__contains__、__concat__
#coding=utf-8
'''
Created on 2015-8-27
@author: xhw
@explain: pass
'''
class Test(object):
def __init__(self,num):
self.num = num
self.start_num = -1
def __len__(self):
'''
@summary: 當使用len(Test)該對象時調用該方法,當沒有該方法是會報錯,且返回數據不爲整數也會報錯
'''
print "__len__"
return self.num - self.start_num - 1
def __iter__(self):
'''
@summary: 迭代器,生成迭代對象時調用,返回值必須是對象自己,然後for可以循環調用next方法
'''
print "__iter__"
return self
def next(self):
'''
@summary: for循環時調用該方法
'''
self.start_num += 1
if self.start_num >= self.num:
raise StopIteration()
return self.start_num
def __reversed__(self):
'''
@summary: 當使用reversed函數翻轉對象時調用
'''
ret = []
for i in range(self.num - 1):
ret.append(self.num - i)
return ret
def __contains__(self, item):
'''
@summary:當使用in,not in 對象的時候 ,not in 是在in完成後再取反,實際上還是in操作
'''
print "__contains__:%s is in?"%item
if item < self.num and item >= 0:
return True
return False
def __concat__(self,other):
'''
@summary: 據說是在使用‘+’操作符操作對象時調用,但不知道該怎麼調用(貌似string 和 list內置該方法)
'''
print "__concat__:Concat ",other
ret = []
for i in range(self.num - 1):
ret.append(self.num - i)
return ret.extend(other)
if __name__ == "__main__":
print len(Test(10))
for i in Test(10):print i
print reversed(Test(10))
if 3 in Test(10):print "True"
else:print False
if 3 not in Test(10):print "True"
else:print False
2. __call__、with、__enter__、__exit__
#coding=utf-8
'''
Created on 2015-8-28
@author: xhw
@explain: pass
'''
class Call(object):
def __init__(self):
pass
def __call__(self,ret):
'''
@summary: 將類對象當做方法直接使用時,調用該方法
'''
print "__call__:Negate ",ret
ret = - ret
class Test(object):
def __init__(self,name,flag):
self.filename = name
self.flag = flag
def __enter__(self):
'''
@summary: 使用with語句是調用,會話管理器在代碼塊開始前調用,返回值與as後的參數綁定
'''
print "__enter__:Open %s"%self.filename
self.f = open(self.filename,self.flag)
return self.f
def __exit__(self,Type, value, traceback):
'''
@summary: 會話管理器在代碼塊執行完成好後調用(不同於__del__)(必須是4個參數)
'''
print "__exit__:Close %s"%self.filename
self.f.close()
if __name__ == "__main__":
A = Call()
print A(15)
with Test('test.txt','r+') as f:
content = f.read()
print content