python魔法方法小感

方法介绍

  • __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__: 限制对象属性

小应用

  • 构建能用obj.属性的方式获取值的字典
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 # 返回True,with才能正常退出

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")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值