67 votes

Comment décorer une méthode à l'intérieur d'une classe?

Essaie de décorer une méthode à l'intérieur d'une classe, mais python est de lancer une erreur sur moi. Ma classe ressemble à ceci:

from pageutils import formatHeader

myPage(object):
   def __init__(self):
      self.PageName = ''

   def createPage(self):
      pageHeader = self.createHeader()

   @formatHeader   #<----- decorator
   def createHeader(self):
       return "Page Header ",self.PageName

if __name__=="__main__":
   page = myPage()
   page.PageName = 'My Page'
   page.createPage()

#------- pageutils.py --------------------

def formatHeader(fn):
   def wrapped():
       return '<div class="page_header">'+fn()+'</div>'
   return wrapped

Python jette l'erreur suivante

auto.createHeader() TypeError: enveloppé() ne prend pas d'arguments (1 donnée)

Où suis-je gaffes

Gath

66voto

krawyoti Points 4533

Vous êtes en omettant les auto paramètre qui est présent dans le non la fonction (createHeader dans votre cas).

def formatHeader(fn):
    from functools import wraps
    @wraps(fn)
    def wrapper(self):
        return '<div class="page_header">'+fn(self)+'</div>'
    return wrapper

Si vous n'êtes pas sûr au sujet de la signature de la fonction que vous voulez pour décorer, vous pouvez le faire assez général comme suit:

def formatHeader(fn):
    from functools import wraps
    @wraps(fn)
    def wrapper(*args, **kw):
        return '<div class="page_header">'+fn(*args, **kw)+'</div>'
    return wrapper

44voto

exhuma Points 3619

Python passe automatiquement en l'occurrence de classe comme référence. (L' self argument qui est vu dans toutes les méthodes de la classe).

Vous pourriez faire:

def formatHeader(fn):
    def wrapped(self=None):
        return '<div class="page_header">'+fn(self)+'</div>'
    return wrapped

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X