Decoradores Python que fazem parte de uma classe base não podem ser usados para decorar funções-membro em classes herdadas
Os decoradores de Python são divertidos de usar, mas eu pareço ter atingido uma parede devido à maneira como os argumentos são transmitidos aos decoradores. Aqui eu tenho um decorador definido como parte de uma classe base (o decorador acessará os membros da classe e, portanto, exigirá o auto-parâmetro).
class SubSystem(object):
def UpdateGUI(self, fun): #function decorator
def wrapper(*args):
self.updateGUIField(*args)
return fun(*args)
return wrapper
def updateGUIField(self, name, value):
if name in self.gui:
if type(self.gui[name]) == System.Windows.Controls.CheckBox:
self.gui[name].IsChecked = value #update checkbox on ui
elif type(self.gui[name]) == System.Windows.Controls.Slider:
self.gui[name].Value = value # update slider on ui
...
Omiti o restante da implementação. Agora, essa classe é uma classe base para vários subsistemas que herdarão dela - algumas das classes herdadas precisarão usar o decorador UpdateGUI.
class DO(SubSystem):
def getport(self, port):
"""Returns the value of Digital Output port "port"."""
pass
@SubSystem.UpdateGUI
def setport(self, port, value):
"""Sets the value of Digital Output port "port"."""
pass
Mais uma vez, omiti as implementações de funções, pois elas não são relevantes.
Resumindo, o problema é que, embora eu possa acessar o decorador definido na classe base a partir da classe herdada, especificando-o como SubSystem.UpdateGUI, finalmente recebo esse TypeError ao tentar usá-lo:
unbound method UpdateGUI() must be called with SubSystem instance as first argument (got function instance instead)
Isso ocorre porque não tenho uma maneira imediatamente identificável de passar oself
parâmetro para o decorador!
Existe uma maneira de fazer isso? Ou atingi os limites da implementação atual do decorador em Python?