Python: Храните декоратор в классе?

-6

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

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: имя 'messaging' не определено на @-decorator. Есть ли способ заставить его работать, чтобы я мог вызвать функцию декоратора, когда он находится в классе? Я на Python 2.7.

спросил(а) 2021-01-28T00:37:18+03:00 2 месяца, 2 недели назад
1
Решение
88

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

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

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"

ответил(а) 2021-01-28T00:37:18+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема