美文网首页
在类中定义Decorator装饰器

在类中定义Decorator装饰器

作者: 蒋狗 | 来源:发表于2016-12-15 14:40 被阅读0次

所需相关包。

import logging
from functools import partial, wraps

logging.basicConfig(level=logging.DEBUG)
  1. 类实例装饰器
class Obj(object):
    def instance_log_decorator(self, func=None, level=logging.DEBUG):
        if not func:
            return partial(self.instance_log_decorator, level=level)

        def wrapper(*args, **kwargs):
            log = logging.getLogger(func.__module__)
            log.log(level, ('execute %s!' % func.__name__))
            return func(*args, **kwargs)
        return wrapper

需要先创建实例。

o = Obj()
@o.instance_log_decorator
def plus(x, y):
    return x + y
  1. 类装饰器
class Obj(object):

    @classmethod
    def cls_log_decorator(cls, func=None, *, level=logging.WARNING):
        if not func:
            return partial(cls.cls_log_decorator, level=level)

        def wrapper(*args, **kwargs):
            log = logging.getLogger(func.__module__)
            log.log(level, ('execute %s!' % func.__name__))
            return func(*args, **kwargs)
        return wrapper

cls_log_decorator作为Obj的类方法直接使用。

@Obj.cls_log_decorator(level=logging.INFO)
def minus(x, y):
    return x - y
  1. @property
class Person(object):
    name = property()

    @name.getter
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise TypeError('excepted string')
        self._name = value

各种不同的装饰器方法会在关联的property 实例上操作它的状态。因此,任何时候只要你碰到需要在装饰器中记录或绑定信息,那么这不失为一种可行方法。 from 《Python CookBook》9.8

相关文章

网友评论

      本文标题:在类中定义Decorator装饰器

      本文链接:https://www.haomeiwen.com/subject/leqgmttx.html