Декораторы 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 при попытке его использовать:

несвязанный метод UpdateGUI ( ) должен вызываться с экземпляром SubSystem в качестве первого аргумента (вместо этого был получен экземпляр функции)

Это потому, что у меня нет возможности сразу передать параметр self декоратору!

Как это сделать? Или я достиг пределов текущей реализации декоратора в Python?

25
задан Aphex 21 November 2014 в 19:15
поделиться