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
    




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值