python 高級屬性

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
    




發佈了44 篇原創文章 · 獲贊 10 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章