2017-05-16 2 views
0

Ich habe dieses Problem, das ziemlich komisch aussieht ... also vielleicht bekomme ich nur die ganze Sache falsch - in diesem Fall, bitte, lass es mich wissen.Vererben aufrufbare Objekte mit verschiedenen Argumenten

Ich habe eine Basisklasse, die __call__ Methode implementiert. Diese Methode hat einige Vorverarbeitung, dann eine abstrakte _call() Methode aufruft und hat einige Nachbearbeitung, wie folgt aus:

class BaseCallable(object): 

    __metaclass__ = abc.ABCMeta 

    @abc.abstractmethod 
    def _call(self, *args, **kwargs): 
     pass 

    def __call__(self, *args, *kwargs): 
     # do some pre-processing 
     result = self._call(*args, **kwargs) 
     # do some post-processing 
     return result 

ich die Basis aufrufbare Objekt in der Lage sein möchte, Unterklasse eine call() Methode hinzufügen, mit einem richtiger Docstring, der verschiedene Argumente akzeptiert und dann springt auf __call__. Ich habe einige Probleme, wie ich auch die Unterschrift der konkreten Umsetzung der _call(), zB ändern sollte:

class Sum(BaseCallable): 

    def _call(self, x, y): 
     return x + y 

    def call(self, x, y): 
     """Docstring.""" 
     return super(Sum, self).__call__(x, y) 

ich so tat, und da pylint klagt:

[pylint] W0221:Parameters differ from overridden '_call' method 

Ich nehme an, es ist etwas, fischig geht weiter. Irgendwelche Vorschläge für ein besseres Design? Vielleicht sollte ich die _call() und __call__() Methoden beschränken, nur **kwargs zu akzeptieren? Danke im Voraus!

+0

Beklagt es sich darüber, dass es nicht 'def call (self, x, y) ist:'? –

+0

@SimeonVisser Entschuldigung, ich habe in Copy & Paste versaut. Wie auch immer, nein, es klagt wegen unterschiedlicher Argumente. Ich werde die Fehlermeldung posten. – petrux

+0

bedeutet dieser Fehler nicht nur "Ihre Parameter sind jetzt' x, y' statt '* args, ** kwars' also ist es nicht auf die gleiche Weise abrufbar" Ich denke, es warnt Sie, dass Sie eine Einschränkung gemacht haben vollständig beabsichtigt zu. –

Antwort

1

Ich denke, dass Ihr Code wie erwartet funktionieren könnte. Es ist nur eine Warnung, Ihnen zu sagen, dass die in der Unterklasse deklarierten Parameter sich von den in der Basisklasse deklarierten unterscheiden. Ich habe Ihren Kommentar gelesen, daher glaube ich nicht, dass ich erklären muss, warum IDE diese Warnung gibt.

Aber eigentlich, was Sie tun möchten, ist die Funktion _call allgemein zu wickeln, so ist es keine normale Basisklasse, sondern eine spezielle.

In einem Wort, Sie haben es überhaupt richtig gemacht.

Verwandte Themen