2017-03-09 1 views
2

Ich bin mehr und mehr vertraut mit statischen Methoden und Klassenmethoden und ich kenne den Unterschied zwischen jedem. Aber ich bin heute auf ein Problem gestoßen, wo ich sowohl auf selfals auch aufcls in einer Methode verweisen möchte.Aufruf der statischen Methode mit dem Klassennamen - Gut oder Schlecht?

Der einzige Weg, ich weiß, wie dies zu tun ist, ein normales Klassenmethode (mit @classmethod, nicht mit def sondern einfach) zu machen und der Klasse ruft damit explizit wie Name ist so:

class myClass: 
    def __init__(): 
     self._ser.connect('COM5') 

    def ask(self, message: str) -> str: 
     return myClass.clean_output(self._ser.query(message)) 

    @staticmethod 
    def clean_output(dirty_string: str): 
     clean_string = dirty_string.strip().replace(chr(4)) 
     return clean_string 

Dieses Beispiel ist eine über vereinfachte Version der Philosophie. Ich möchte eine saubere oder analysierende Funktion für Daten aufrufen, die ich zurückbekomme, wie von einem seriellen Gerät. Gibt es eine Möglichkeit die fragen Verfahren wie so ?:

def ask(self, message: str) -> str: 
     return cls.clean_output(self._ser.query(message)) 

umzusetzen Oder ist es in Ordnung, dass ich es mit myClass ausdrücklich so bin Aufruf? Wenn ja, wann sollten Programmierer @classmethod verwenden und wann darf der Klassenname selbst verwendet werden? Wird der Dekorator @classmethod nur dann wirklich benötigt, wenn Sie erwarten, dass Unterklassen eintreten?

Antwort

3

Rufen Sie die statische Methode auf self:

def ask(self, message: str) -> str: 
    return self.clean_output(self._ser.query(message)) 

Es gibt auch vorhanden ist.

Attribute einer Klasse sind auf den Instanzen zu immer zur Verfügung (sofern kein Attribut für die Instanz selbst mit dem gleichen Namen es Maskierung). Methoden (seien es reguläre, statische oder Klassenmethoden) sind keine Ausnahmen, sie sind auch nur Attribute. Ihr Bindungsverhalten spielt hier keine Rolle.

+0

Ah meine Güte ... Das war zu einfach. Danke dafür. Werden diese Informationen irgendwo veröffentlicht? Ich schaute, aber vielleicht habe ich Google nicht die richtige Frage gestellt. Es macht durchaus Sinn, dass Instanzen auch Klassenmethoden haben. Do! – boymeetscode

+0

@boymeetscode: Ich habe hinzugefügt, warum sie zur Verfügung stehen; static Objekte sind hier nicht besonders, so wird es keine spezielle Dokumentation dort zu zeigen sein. :-) –

Verwandte Themen