python class 属性周围的装饰器/包装器

Decorator / wrapper around python class attribute

我正在尝试增强 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>

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

使用这个:

def MyProperty(func):

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

    return property(getter)