python 高级属性
2015-08-27 19:05
633 查看
1. 类的属性相关操作:
__setattr__、__getattr__、__delattr__、__setitem__、__getitem__、__delitem__
2. __len__、__iter__、__reversed__、__contains__、__concat__
2. __call__、with、__enter__、__exit__
__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
相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例