Декоратор / обертка вокруг атрибута класса Python - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь улучшить поведение по умолчанию @property в Python:

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 Ответ

1 голос
/ 17 октября 2019

Используйте это:

def MyProperty(func):

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

    return property(getter)
...