У меня есть класс, который украшает некоторые методы, используя декоратор из другой библиотеки. В частности, подклассы класса, поддерживающие фляжку, украшают http-методы с помощью httpauth.HTTPBasicAuth().login_required()
и делают некоторые разумные значения по умолчанию для службы модели.
В большинстве подклассов я хочу, чтобы декоратор применялся; поэтому я скорее удалю его, чем добавлю его в подклассы.
Моя мысль состоит в том, чтобы иметь частный метод, который выполняет операции и публичный метод, который оформлен. Эффектов от украшения можно избежать, переопределив открытый метод, чтобы вызвать частный, а не украсить это переопределение. Подчеркнутый пример ниже.
Мне любопытно узнать, есть ли лучший способ сделать это. Есть ли ярлык для "отмены декораторов" в python, который дает этот эффект?
Или вы можете рекомендовать лучший подход?
Некоторые другие вопросы имеют подходящие ответы для этого, например. Есть ли способ получить функцию, которую украсил декоратор?. Но мой вопрос заключается в более широком дизайне - меня интересует любой питонический способ запускать операции в декорированных методах без эффекта украшения. Например. мой пример - один такой способ, но могут быть и другие.
def auth_required(fn):
def new_fn(*args, **kwargs):
print('Auth required for this resource...')
fn(*args, **kwargs)
return new_fn
class Resource:
name = None
@auth_required
def get(self):
self._get()
def _get(self):
print('Getting %s' %self.name)
class Eggs(Resource):
name = 'Eggs'
class Spam(Resource):
name = 'Spam'
def get(self):
self._get()
# super(Spam, self)._get()
eggs = Eggs()
spam = Spam()
eggs.get()
# Auth required for this resource...
# Getting Eggs
spam.get()
# Getting Spam