2017-09-30 3 views
0

Angenommen, wir haben eine KlassePythonic Art und Weise lange Verfahren zur Handhabung ruft innerhalb von Klassen

class foo(): 
    def __init__(self): 
     self.data = 10 
    ... 

    def method(self): 
     ... 
     self.free_indices.append(self.l[self.start_p]) 
     var1 = self.l[self.search(var2[num])].pointer 
     ... 

Es ist deutlich, dass das Verfahren und die Anrufe Attribut gesehen wird innerhalb der Klasse zu lang ist und damit die Lesbarkeit des Codes abnimmt. Um dies zu beheben, dass man ein Paar von Methoden

def get_some_att(self, var2, num): 
     return self.l[self.search(var2[num])].pointer 

    def append_index(self): 
     self.free_indices.append(self.l[self.start_p]) 

die auf den ersten Blick vernünftig erscheint schaffen könnte, aber Angenommen, Sie haben ein Dutzend solcher verschiedenen Anrufe, also was werden Sie tun? Werden Sie ein Dutzend get_some_att Methoden erstellen und damit die Ausführungsgeschwindigkeit insgesamt dramatisch reduzieren. Oder werden Sie gerne alle Anrufe vergessen, um die Geschwindigkeit zu erhöhen, aber Kompromisse bei der Lesbarkeit machen. Was also ist der wahre Python ™ ™ - Weg, um mit solchen Dilemmata umzugehen?

+1

Wie ist 'self.get_some_att (self.data) 'lesbarer als' self.some_att [self.data] '? – Barmar

+0

Sie haben Recht. Das war ein schlechtes Beispiel, ich werde zu einem relevanteren wechseln. –

+0

Vielleicht, was Sie suchen, sind Immobilien Getters und Setter? https://stackoverflow.com/questions/2627002/whats-the-pythonic-way-to-use-getters-and-setters – Barmar

Antwort

0

Gemäß PEP8 besteht die bevorzugte Methode zum Unterbrechen langer Zeilen ohne Verwendung von \ darin, die Anweisungen in Klammern zu schreiben. Zum Beispiel:

class foo(): 
def __init__(self): 
    self.data = 10 

def method(self): 
    self.free_indices.append(self.l[self.start_p]) 
    var1 = (
     self.l[self.search(var2[num])] 
      .var3 # you can chain method/attribute calls vertically 
    ) 
+0

Sie schlagen also vor, dass ich mich nicht darum kümmern sollte, "Methoden" oder Prozeduren zu erstellen? Auch für häufige? –

+0

Ich schlage vor zu versuchen, Ihre Datenstrukturen zu vereinfachen und Attributnamen so klar wie möglich zu machen, und beziehen sich vorzugsweise auf die Attribute explizit. Eine Reihe von Getter und Setter zu definieren ist manchmal praktisch, aber Sie sollten nur eine Handvoll davon haben. Wenn Sie dynamisch auf das Attribut eines Objekts zugreifen müssen, können Sie 'getattr 'verwenden. – JAponte

0

Ob ein einzelnes method mit mehreren Aufgaben oder brechen sie in eine separaten ein, get_some_att und append_index, zu tun, ist alles darüber, wie Sie die Klasse/Modul entwerfen.

Es geht nicht nur um Lesbarkeit, sondern auch Wartbarkeit. Eine separate Methode für eine bestimmte Aufgabe hilft Ihnen nicht nur, auf sie zuzugreifen, wenn Sie sie in Zukunft benötigen, sondern Sie können den Code auch verbessern, wenn Ausnahmen auftreten oder die Erweiterung weiter verbessert wird. Daher hilft Ihnen die Verwendung separater Methoden (für jeden einzelnen Job), die Ausnahmen zurückzuverfolgen und Ihnen die Freiheit zu geben, den einzigen Abschnitt zu ändern.

Also werde ich in langen Lauf von (große/sehr große) Projekte sagen (die in der Tat mit der Zeit sein wird), ist es absolut notwendig, eine separate Methoden für jeden einzelnen Jobs für bessere Lesbarkeit, Wartbarkeit und einfach zu debuggen und zu haben Fix.

Ja ich stimme zu, die Ausführungszeit kostet Sie wahrscheinlich etwas mehr, aber es lohnt sich, weil es Ihnen viel Entwicklungszeit sparen wird, und Ihnen hilft, den Fehler leicht auf der Produktion zu verfolgen.

Nun zu der Pythonic Art des Codes zu tun, dann werde ich vorschlagen, dass Sie ein Werkzeug pylint oder flake8 verwenden, um Dateikomplexität zu überprüfen.

Trotzdem für alle einzelnen Aufgaben ein separates Verfahren, die es wert tun, wenn Sie wissen, es könnte für andere Orte als auch in naher Zukunft erfordern (praktizierenden DRY)

Verwandte Themen