Mam klasę, która dekoruje niektóre metody za pomocą dekoratora z innej biblioteki. Konkretnie, klasy podklas zasobów zasobniki kolby, dekoruje metody http z httpauth.HTTPBasicAuth().login_required()
, a niektóre sensowne ustawienia domyślne w usłudze modelu.Czy istnieje sposób podpowiedzi na pominięcie dekoracji w metodzie podklasy?
W przypadku większości podklas chcę zastosować dekorator; dlatego wolałbym go usunąć niż dodać do podklas.
Moją myślą jest mieć prywatną metodę, która wykonuje operacje i publiczną metodę, która jest dekorowana. Efektów dekoracji można uniknąć, zastępując metodę publiczną, aby wywołać prywatną, a nie dekorując to zastąpienie. Wyśmiewany przykład poniżej.
Jestem ciekawy, czy istnieje lepszy sposób na zrobienie tego. Czy jest skrót do "anulowania dekoratorów" w python, który daje ten efekt?
Czy możesz polecić lepsze podejście?
Kilka innych pytań zawiera odpowiednie odpowiedzi, np. Is there a way to get the function a decorator has wrapped?. Ale moje pytanie dotyczy szerszego projektu - interesuje mnie pytoniczny sposób, aby uruchomić operacje w dekorowanych metodach bez efektów dekoracyjnych. Na przykład. mój przykład jest taki, ale mogą istnieć inne.
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
Możliwy duplikat [Czy istnieje sposób, aby uzyskać funkcję, którą dekorator zawinął?] (Http://stackoverflow.com/questions/1545178/is- tam-a-sposób-by-uzyskać-funkcję-a-dekorator-owinął) – Oin