J'ai trouvé moyen d'avoir un décorateur en classe, d'avoir un décorateur avec des arguments, de décorer la fonction avec des arguments. Mais je ne peux pas tout faire fonctionner ensemble. Comment puis-je faire ce travail?décorateur en classe avec des arguments pour la fonction qui accepte les arguments
class Printer():
"""
Print thing with my ESCPOS printer
"""
def text(self, text):
with open('/dev/usb/lp0', 'wb') as lp0:
lp0.write(text.encode('cp437'))
lp0.write(b'\n')
def command(self, command):
with open('/dev/usb/lp0', 'wb') as lp0:
lp0.write(command)
lp0.write(b'\n')
def style(command_before, command_after):
"""
Send a command before and a command after
"""
def decorator(func):
def wrapper(self, text):
print(self)
print(text)
self.command(command_before)
func(text)
self.command(command_after)
return wrapper
return decorator
@style((b'\x1D\x42\x31'), (b'\x1D\x42\x32')) #print white on black
@style((b'\x1D\x21\x34'), (b'\x1D\y21\x00')) #print bigger
def title(self, title_text):
self.text(title_text)
alors je pourrais l'utiliser de cette façon:
p = Printer()
p.title('This is an awesome TITLE!!')
Cela me donne un "TypeError: emballage() manquant 1 nécessaire argument de position: 'texte'"
Mais je juste échouer à l'obtenir:/
est 'le style()' censé être une méthode statique? Vous ne passez pas en 'self' –
' style' semble seulement destiné à être utilisé dans la définition de la classe; ce que fait la métaclasse une fois la classe définie ne semble pas avoir d'importance. – chepner
@chepner: Ah. Je pense que je comprends. :) Parce que 'style' est utilisé comme décorateur pendant la définition de la classe, il se comporte comme une fonction normale (non liée), pas comme une méthode, donc il ne prend pas un argument' self'. Et cela signifie que nous pourrions déplacer la définition de 'style' en dehors de la classe' Printer(): 'definition & cela fonctionnera correctement. –