您的位置:首页 > 编程语言 > Python开发

python 高级属性

2015-08-27 19:05 633 查看
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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python class 属性