Python - 元编程
Allen_by
充满理想与追求,这一切似在指尖、心尖,都缠绕,都充盈,蓬勃待飞C语言、汇编语言、数据库系统、JAVA编程思想、C++程序设计、数据结构、计算机网络及算法与数据结构等专业知识擅长的计算机语言,以及计算机硬件的知识。数据库知识和经验,网络知识和技能
展开
-
带有可选参数的装饰器
有时候需要写一个装饰器,既可以不传参数给它,也可以传递可选参数给它。 from functools import wraps, partial import logging def logged(func=None, *, level=logging.DEBUG, name=None, message=None): if func is None: return par...原创 2019-01-18 22:52:22 · 390 阅读 · 0 评论 -
使用装饰器扩充类的功能
想通过反省或者重写类定义的某部分来修改它的行为,但是你又不希望使用继承或元类的方式。 def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.__getattribute__ # Make a new definition def new_getatt...原创 2019-01-30 20:46:06 · 211 阅读 · 0 评论 -
装饰器为被包装函数增加参数
在装饰器中给被包装函数增加额外的参数,但是不能影响这个函数现有的调用规则。 from functools import wraps def optional_debug(func): @wraps(func) def wrapper(*args, debug=False, **kwargs): if debug: print('Calli...原创 2019-01-22 13:24:07 · 578 阅读 · 0 评论 -
自定义带有属性的装饰器
需要写一个装饰器来包装一个函数,并且允许操作者提供参数在运行时控制装饰器行为。 from functools import wraps, partial import logging def attach_wrapper(obj, func=None): if func is None: return partial(attach_wrapper, obj) s...原创 2019-01-18 22:52:08 · 337 阅读 · 0 评论 -
定义可以接受参数的装饰器
假设你想写一个装饰器,给函数添加日志功能,同时允许用户指定日志的级别和其他的选项。 from functools import wraps import logging def logged(level, name=None, message=None): """ :param level: :param name: :param message: :r...原创 2019-01-15 21:26:51 · 309 阅读 · 0 评论 -
装饰类方法和静态方法
装饰类方法或静态方法是很简单的,不过要确保装饰器在 @classmethod 或 @staticmethod 之前。 import time from functools import wraps def timethis(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() ...原创 2019-01-30 20:45:55 · 220 阅读 · 0 评论 -
撤销一个装饰器
一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。 假设装饰器是通过functools包中的wraps @wraps来实现的,那么可以通过访问 _wrapped_ 属性来访问原始函数: import time from functools import wraps def Time_D(func): ''' Decorator that reports t...原创 2019-01-15 21:27:12 · 207 阅读 · 0 评论 -
集成类装饰器
使用一个装饰器去包装函数,并返回一个可调用的实例。 装饰器还可以同时工作在类定义的内部和外部。 将装饰器定义成一个实例,你需要确保它实现了 _call_() 和 _get_() 方法。 import types from functools import wraps class Profiled: def __init__(self, func): wraps(func...原创 2019-01-18 22:52:53 · 238 阅读 · 1 评论 -
实现类装饰器
在类中定义装饰器,并将其作用在其他函数或方法上。 from functools import wraps class A: # Decorator as an instance method def decorator1(self, func): @wraps(func) def wrapper(*args, **kwargs): ...原创 2019-01-18 22:52:42 · 213 阅读 · 0 评论 -
使用装饰器对函数传参进行类型检查
from inspect import signature from functools import wraps def typeassert(*ty_args, **ty_kwargs): """ :param ty_args: :param ty_kwargs: :return: """ def decorate(func): ..原创 2019-01-18 22:52:33 · 596 阅读 · 0 评论 -
在函数上添加装饰器
想在已经存在的函数上添加一个装饰器,增加额外的操作处理(比如权限,日志、计时等)。 例如: import time from functools import wraps def Count_Time(func): """ :param func: :return: """ @wraps(func) def wrapper(*args, **k...原创 2019-01-12 15:47:41 · 876 阅读 · 0 评论 -
使用元类控制实例的创建
想通过改变实例创建方式来实现单例、缓存或其他类似的特性。可以定义一个元类并自己实现 _call_() 方法 class NoInstances(type): def __call__(self, *args, **kwargs): raise TypeError("Can't instantiate directly") # Example class Spam(meta...原创 2019-02-20 13:21:24 · 178 阅读 · 0 评论