方法介绍
__getattr__ : 访问不存在的属性,会自动调用这个函数作为返回值__getattribute__ : 那么无论访问什么属性,都是通过这个函数获取,包括方法;如果__getattribute__抛出了AttributeError异常,并且定了了__getattr__函数,那么会调用__getattr__这个函数,不论这个属性到底是不是存在,也就是说属性访问的一个大致优先级是:__getattribute__ > __getattr__ > __dict____dict__ : 存储对象属性__get__,__set__,__delete__ :一个类中,只要实现了其中的任意一种,我们就可以叫它描述器(descriptor)。如果只定义了__get__我们叫非资料描述器(non-data descriptor),如果__set__,__delete__任意一个/或者同时出现,我们叫资料描述器(data descriptor)。__getitem__ : 字典使用中括号([])取值的时候所走的方法__setitem_ _: 设置字典的键值对的时候所走的方法__enter__()和__exit__() :基于类的资源管理器(获取/释放资源)必须实现这两个方法,其中,方法“__enter__()”返回需要被管理的资源,方法“__exit__()”里通常会存在一些释放、清理资源的操作,比如这个例子中的关闭文件等等,这样可以直接使用with语句。 基于生成器的资源管理器:使用装饰器 contextlib.contextmanager,来定义自己所需的基于生成器的上下文管理器,用以支持 with 语句。__slots__ : 限制对象属性
小应用
class LookupDict ( dict ) :
"""Dictionary lookup object."""
def __getattr__ ( self, item) :
return self. __dict__. get( item, None )
def __setitem__ ( self, key, value) :
self. __dict__[ key] = value
return super ( LookupDict, self) . __setitem__( key, value)
class FileManager :
def __init__ ( self, filepath, mode= 'r' , encoding= 'utf-8' ) :
self. filepath= filepath
self. mode= mode
self. encoding= encoding
def __enter__ ( self) :
self. f= open ( self. filepath, mode= self. mode, encoding= self. encoding)
return self. f
def __exit__ ( self, exc_type, exc_val, exc_tb) :
self. f. close( )
return True
if __name__ == '__main__' :
with Open( 'test.txt' , 'w' ) as f:
print ( f)
f. write( 'helloworld' )
from contextlib import contextmanager
@contextmanager
def file_open ( path) :
try :
f_obj = open ( path, "w" )
yield f_obj
except OSError:
print ( "error!" )
finally :
print ( "Closing file" )
f_obj. close( )
if __name__ == "__main__" :
with file_open( "test.txt" ) as fobj:
fobj. write( "helloworld" )