2010-10-26 2 views
11

Ich habe versucht, Eigenschaften anstelle von spezifischen Setter und Getters in meiner App zu verwenden. Sie erscheinen eher pythonisch und machen meinen Code im Allgemeinen lesbarer.Ich frage mich, ob ich nur Eigenschaften in Python verwenden sollte.

Besser lesbar bis auf ein Problem: Tippfehler.

das folgende einfache Beispiel (beachten Sie, meine Eigenschaften tatsächlich einige Verarbeitung tun, obwohl die hier Beispiele nur eine einfache Variable oder Rückkehr)

class GotNoClass(object): 

    def __init__(self): 
     object.__init__(self) 
     self.__a = None 

    def __set_a(self, a): 
     self.__a = a 

    def __get_a(self): 
     return self.__a 

    paramName = property(__get_a, __set_a) 


if __name__ == "__main__": 
    classy = GotNoClass() 

    classy.paramName = 100 
    print classy.paramName 

    classy.paranName = 200 
    print classy.paramName 

    #oops! Typo above! as seen by this line: 
    print classy.paranName 

Den Ausgang, wie jeder, der eng ein wenig liest, wird sehen ist:

100 
100 
200 

Oops. Sollte nicht gewesen sein, außer für die Tatsache, dass ich einen Tippfehler gemacht habe - ich schrieb paranName (zwei ns) anstelle von paramName.

Dies ist einfach zu debuggen in diesem einfachen Beispiel, aber es hat mich in meinem größeren Projekt verletzt. Da Python glücklich eine neue Variable erstellt, wenn ich versehentlich eine Eigenschaft verwenden wollte, erhalte ich subtile Fehler in meinem Code. Fehler, die ich manchmal schwer aufspüren kann. Schlimmer noch, ich habe einmal den gleichen Tippfehler zweimal benutzt (einmal als ich eingestellt habe und später einmal als ich bekam), also schien mein Code zu funktionieren, aber viel später, als ein anderer Codezweig schließlich versuchte, auf diese Eigenschaft zuzugreifen (richtig) Ich habe den falschen Wert bekommen - aber ich habe einige Tage gebraucht, bis ich gemerkt habe, dass meine Ergebnisse nur ein bisschen ausgefallen sind.

Jetzt, da ich weiß, dass dies ein Problem ist, verbringe ich mehr Zeit, meinen Code zu lesen, aber idealerweise hätte ich einen Weg, diese Situation automatisch zu erfassen - wenn ich nur einen vermisse, kann ich einen Fehler einführen, der das nicht tut zeigen Sie sich, bis ein gutes Stück Zeit vergangen ist ...

Also frage ich mich, sollte ich nur auf gute alte Setter und Getters wechseln? Oder gibt es eine nette Möglichkeit, diese Situation zu vermeiden? Verlassen sich die Leute nur auf sich selbst, um diese Fehler manuell zu erfassen? Leider bin ich kein professioneller Programmierer, nur jemand, der versucht, hier bei der Arbeit etwas zu erledigen, und ich weiß nicht wirklich, wie ich das am besten angehen soll.

Danke.

P.S. Ich verstehe, dass dies auch einer der Vorteile von Python ist und ich beschwere mich nicht darüber. Ich frage mich nur, ob es besser wäre, explizite Setter und Getter zu verwenden.

+0

Das gleiche passiert für einfache Attribute, ganz zu schweigen von lokalen Variablen. Es ist ein direkter Nebeneffekt des Designs der Sprache und der Versuch, es zu "reparieren", wird im Allgemeinen größere Probleme verursachen. Ich habe es jedoch nie als großes Problem empfunden. –

+0

Das ist absolut richtig und nachdem ich gepostet habe, habe ich ein bisschen mehr darüber nachgedacht. Ich denke, der Grund, warum es mehr passiert, ist, dass ich mich jetzt so sehr auf Eigenschaften stütze (im Vergleich zu meinen alten Setter und Getter) und daher eher auf einen solchen Fehler stoße. Der Trick wird sein, das Problem so weit wie möglich zu minimieren und vorsichtiger zu sein. – Ben

Antwort

0

Es gibt Zeiten, in denen die Überprüfung der Kompilierzeit wirklich Zeit spart. Sie scheinen einen solchen Fall identifiziert zu haben. Durch Zufall anstatt sorgfältige Wahl verwende ich Getter und Setter und bin glücklich ;-)

2

Je nachdem, wie Ihr Code funktioniert, können Sie versuchen, slots verwenden. Sie erhalten eine AttributeError-Ausnahme, wenn Sie versuchen, etwas zuzuweisen, das nicht in Slots ist, wodurch solche Tippfehler deutlicher werden.

+0

Wow.Slots sind sehr, sehr interessant (und neu für mich). Ich werde sie definitiv als Teil meiner App implementieren, aber nicht um dieses Problem zu lösen. Es scheint, als ob es sich dabei um einen Missbrauch ihres beabsichtigten Zwecks handeln könnte (der, so versichere ich mich, ist es, Speicherabdrücke von Objekten zu reduzieren, die wahrscheinlich sehr oft instanziert werden). Eine Sache, über die ich nachdenke, ist, sie während der Entwicklung vorübergehend zu verwenden und sie dann zu schließen, sobald ich meinen Code fertig habe - so werden sie mich jetzt ehrlich halten, aber nicht wirklich benutzt (oder missbraucht?), Sobald meine App ist Komplett. – Ben

+0

Auf den zweiten Gedanken, einige unbeabsichtigte Folgen der Verwendung von __slots__ betrachtend, werde ich sie nicht sogar während der Entwicklung implementieren. Immer noch sehr cool darüber zu lernen. – Ben

Verwandte Themen