Декораторы Python забавны в использовании, но я, кажется, ударил стену из-за того, как аргументы передаются декораторам. Здесь у меня есть декоратор, определенный как часть базового класса (декоратор будет обращаться к членам класса, следовательно, для этого потребуется параметр self).
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
...
Я пропустил оставшуюся часть реализации. Теперь этот класс является базовым классом для различных SubSystems, которые наследуют его - некоторым унаследованным классам необходимо будет использовать декоратор 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
Я снова опустил реализацию функций, поскольку они не имеют отношения к делу.
Вкратце проблема заключается в том, что, хотя я могу получить доступ к декоратору, определенному в базовом классе, из унаследованного класса, указав его как SubSystem.UpdateGUI, я в конечном итоге получаю этот TypeError при попытке его использования:
unbound method UpdateGUI() must be called with SubSystem instance as first argument (got function instance instead)
Это потому, что я не могу сразу идентифицировать способ передачи параметра self
декоратору!
Есть ли способ сделать это? Или я достиг пределов текущей реализации декоратора в Python?