Пользовательский декоратор свойств python, который ведет себя как @property - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы создать собственный декоратор Python, который будет 1) проверять значение атрибута класса my_attribute перед запуском функции и 2) превращать метод класса в свойство. Я могу добиться этого следующим образом:

def my_decorator(f):
    def wrapper(self, *args, **kwargs):
        if self.my_attribute is None:
            raise ValueError('No location set to model.')

        return f(self, *args, **kwargs)
    return wrapper

class MyClass:
    my_attribute = None

    @property
    @my_decorator
    def my_method():
        return self. my_attribute

Я хотел бы знать, как я могу отредактировать определение my_decorator, чтобы оно превращало упакованный метод в свойство. По сути, я бы хотел избежать использования @property и @my_decorator для каждого метода, поэтому позвольте мне написать определение класса как

class MyClass:
    my_attribute = None

    @my_new_decorator
    def my_method():
        return self. my_attribute

Я посмотрел объявление встроенного @property декоратора, но он определен как класс и не сильно помог.

Есть предложения?

1 Ответ

0 голосов
/ 15 мая 2018

Что если вы изменили определение декоратора, чтобы оно выглядело так?

def my_decorator(f):
    @property
    def wrapper(self, *args, **kwargs):
        if self.my_attribute is None:
            raise ValueError('No location set to model.')

        return f(self, *args, **kwargs)
    return wrapper

Это должно привести к тому, что возвращаемая функция будет вести себя как свойство и сохранить вашу собственную обработку ошибок.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...