予学习python一直浮于表面,常常为是了解决某个问题,往往浅尝辄止,沉下来想想其实自己什么也没学到,《Python cookbook》这本书挺有意思的,把python中的一些点点滴滴,对一些常见库的高级用法系统的总结了出来,这点比国内写python宏篇巨著的人不知强了多少倍,曾记得有个人号称年年出版一本书,要么是真牛,要么是骗子,想来骗子的概率更大一些。

内置的一些属性,主要包括__repr__,__str__,主要用来打印和构造时用的,__format__主要用来格式化用的,属性有两种设置方法,__enter__和__exit__是在进行上下文管理用的,我能做的尽量是在一个例子把所有相关内容都呈现出来,而不是原封不到抄一遍例子,这样便于自己查阅,也便于巩固自己的技能。

人生苦短,我用Python。自欺欺人的一段话,各位领导和大爷们才不会关心你用啥。



class ClassDemo:
#创建大量对象时节省内存方法,暂时不使用
#_slots__ = ['x', 'y','z','_formats']
def __init__(self,x,y):
self.x = x
self.y = y
self.z = 0
self._formats = {'x-y': '{0},{1}',
'y-x': '{1},{0}'}
#返回一个实例的代码表示形式,通常用来重新构造实例
def __repr__(self):
return '__repr__{},{}'.format(self.x,self.y)


#以字符串形式返回实例,主要使用在str()或print()函数中
def __str__(self):
return '__str__({},{})'.format(self.x,self.y)


#自定义字符串的格式化
def __format__(self,code):
if code=='' or code not in self._formats :code='x-y'
fmt = self._formats[code]
return fmt.format(self.x,self.y)


#定义Getter函数
@property
def x(self):
print('@property x')
return self._x
#定义Setter函数
@x.setter
def x(self, value):
print('@x.setter x')
if not isinstance(value, int):
raise TypeError('Expected a integer')
self._x = value
#定义Delete函数
@x.deleter
def x(self):
print('@x.deleter')
raise AttributeError("Can't delete attribute")


# 定义Getter函数
def get_y(self):
print('property get_y')
return self._y
# 定义Setter函数
def set_y(self, value):
print('property set_y')
if not isinstance(value, int):
raise TypeError('Expected a integer')
self._y = value
# 定义Delete函数
def del_y(self):
print('property del_y')
del self._y


# 定义Getter函数
def get_xy(self):
print('property get_xy')
return self._x,self._y
# 定义Setter函数
#value只能是一个参数,可以是tuple,list或dict
def set_xy(self,value):
print('property set_xy')
if not isinstance(value, tuple):
raise TypeError('value Expected a tuple')
self._x = value[0]
self._y = value[1]
# 定义Delete函数
def del_xy(self):
print('property del_xy')
del self._y
del self._x


y = property(get_y,set_y,del_y)
xy = property(get_xy, set_xy, del_xy)


#让对象支持上下文管理协议
# 连接和初始化工作
def __enter__(self):
self.z = 1
print('object in status of enter and z = {}'.format(self.z))
return self.z
# 释放和销毁工作
def __exit__(self, exc_ty, exc_val, tb):
self.z = 0
print('object in status of exit and z = {}'.format(self.z))
return


if __name__ == '__main__':
#初始化实例
p=ClassDemo(3,4)
print(p)
#缺省格式化
fmtp = format(p)
print(fmtp)
#正常格式化x-y
fmtp = format(p, 'x-y')
print(fmtp)
# 正常格式化y-x
fmtp = format(p,'y-x')
print(fmtp)
#未定义格式化
fmtp = format(p,'xy')
print(fmtp)
#with语法
with p as test:
print('enter return values={}'.format(p))
print('with method')
# with 语句的输出结果
# object in status of enter and z = 1
# enter return values=3,4
# with method
# object in status of exit and z = 0
print(p.x)
# @property x # 3
print(p.y)
# property get_y # 4
p.x=5 #@x.setter x
p.y=6 #property set_y
print(p.x) #@property x 5
print(p.y) #property get_y 6
p.xy=(6,7) #property set_xy
print(p.xy) #property get_xy (5, 6)
del p.x #@x.deleter raise AttributeError("Can't delete attribute")
del p.y #property del_y
del p.xy #property del_xy,会抛出异常,因为y已经被删除