围绕python类属性的装饰器/包装器

时间:2019-10-17 11:33:48

标签: python python-2.7 properties wrapper

我正在尝试增强Python中的默认@property行为:

from functools import wraps

def MyProperty(func):
    def getter(self):
        """Enhance the property"""
        return func(self) + 1

    return property(getter)

class MyClass(object):
    def __init__(self, foo):
        self._foo = foo

    @MyProperty
    def foo(self):
        return self._foo

这一切都很好,我得到了预期的效果

A = MyClass(5)
A.foo
>>> 6

由于我是这样学习的,出于良好的实践原因,我想将wraps装饰器应用于包装器。但是如果我将包装器写为

def MyProperty(func):
    @wraps
    def getter(self):
        """Enhance the property"""
        return func(self) + 1

    return property(getter)

我现在得到

A = MyClass(5)
A.foo
>>> <__main__.MyClass object at 0x7f209f4aa0d0>

这不是我期望的。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用此:

def MyProperty(func):

    @wraps(func)
    def getter(self):
        """Enhance the property"""
        return func(self) + 1

    return property(getter)