Декораторы Python, являющиеся частью базового класса, не могут использоваться для украшения функций-членов в унаследованных классах
Декораторы 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
...
Я опустил остальную часть реализации. Теперь этот класс является базовым классом для различных подсистем, которые будут наследоваться от него - некоторые из унаследованных классов должны будут использовать декоратор 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?