Python: хранить декоратор в классе? - PullRequest
0 голосов
/ 07 июня 2018

Мой декоратор работает хорошо и хорошо, и теперь хранится в модуле.Если возможно, я бы хотел сохранить его в классе , где он будет находиться со связанными функциями.Тем не менее, я не могу заставить его работать, это код (без ненужных частей):

class MqPubSubFwdController(object):

    def __init__(self, address, port_pub, port_sub):

        self.mq_path_list = []
        self.mq_path_func = {}

    def handle_mq(self, mq_path, cmd=None):
        """ Decorator function.
            Registers the MQ path
        """
        def decorator(fn):
            key = "my_key"
            self.mq_path_list.append(prepostfix(mq_path).lower())
            self.mq_path_func[key] = fn

            def decorated(*args,**kwargs):
                return fn(*args,**kwargs)
            return decorated
        return decorator

@messaging.handle_mq('/mode/set','PUT')
def mq_mode_set(path=None, cmd=None, args=None, data=None):
    """ Set mode """
    print "A MODE WAS SET"
    return "A MODE WAS SET"

messaging = MqPubSubFwdController('localhost',1,2)

Это возвращает ошибку NameError: имя 'message' не определено на @ -декораторе.Есть ли способ заставить его работать так, чтобы я мог вызывать функцию декоратора, когда находится в классе?Я на Python 2.7.

1 Ответ

0 голосов
/ 08 июня 2018

Как сказал Аран-Фей, речь идет о месте.Класс должен быть инициализирован, прежде чем вы сможете ссылаться на функцию декоратора внутри него.

Это правильный код:

class MqPubSubFwdController(object):

    def __init__(self, address, port_pub, port_sub):

        self.mq_path_list = []
        self.mq_path_func = {}

    def handle_mq(self, mq_path, cmd=None):
        """ Decorator function.
            Registers the MQ path
        """
        def decorator(fn):
            key = "my_key"
            self.mq_path_list.append(mq_path.lower())
            self.mq_path_func[key] = fn

            def decorated(*args,**kwargs):
                return fn(*args,**kwargs)
            return decorated
        return decorator

messaging = MqPubSubFwdController('localhost',1,2)

@messaging.handle_mq('/mode/set','PUT')
def mq_mode_set(path=None, cmd=None, args=None, data=None):
    """ Set mode """
    print "A MODE WAS SET"
    return "A MODE WAS SET"
...