2014-12-09 4 views
0

Итак, вот что у меня есть:Переопределение декоратора абстрактного класса в унаследованной классе

Абстрактный класс:

class DataWrapper(object): 
    def decorator(f): 
     def preprocess(*args, **kwargs): 
      return f(*args, **kwargs) 
     return preprocess 

    @decorator 
    def datamethod1(self, ..): ... 

    @decorator 
    def datamethod2(self, ..): ... 

наследование Класс:

class DataManipulation(DataWrapper): 
    def __init__(self, ..): .. 

    def decorator(f): 
     print 'here' 
     def preprocess(*args, **kwargs): 
      ret = f(*args, **kwargs) 
     return preprocess 

По существу у меня есть куча общих методов данных (определенных в DataWrapper), которые используются различными классами. Я разрешаю, чтобы декоратор был определен для выполнения любой предварительной/последующей обработки данных перед возвратом, который определен в DataWrapper так же, как местозаполнитель.

К сожалению, декоратор не переопределяется, когда я пытаюсь определить его в унаследованных классах; то есть «здесь» не печатается.

Я увидел this и попробовал добавить переопределяющий декоратор в унаследованном классе, и пока нет ошибки, «здесь» все еще не печатается.

У кого-нибудь есть предложения?

ответ

3

Декораторы применяются к функциям , когда класс определяется, их возвращение значения заменить функции, которые они оформленная. К моменту определения класса DataWrapper вы больше не можете изменять, какой декоратор используется.

Вместо использования декораторов, имеют декоратора делегатом другим способом на классе, что подклассы могут переопределить:

def method_process(f): 
    def wrapper(self, *args, **kwargs) 
     return self.process(f, *args, **kwargs)     

class DataWrapper(object): 
    def process(self, f, *args, **kwargs): 
     # subclass to process the methods 
     return f(self, *args, **kwargs) 

    @method_process 
    def datamethod1(self, ..): 
     # ... 

    @method_process 
    def datamethod2(self, ..): 
     # ... 


class DataManipulation(DataWrapper):  
    def process(self, f, *args, **kwargs): 
     print 'preprocessing here' 
     return super(DataManipulation, self).process(f, *args, **kwargs) 
+0

Clever, и работает, как ожидалось. Большое спасибо. – user1769889