2015-04-10 14 views
6

Mit dem @property Dekorator hat Python die Notwendigkeit von Getter und Setter für Objekteigenschaften komplett eliminiert (manche sagen "Attribute"). Dies macht Code viel einfacher, während die Erweiterbarkeit beibehalten wird, wenn die Dinge komplexer werden müssen.Python: Prädikat Methoden als Eigenschaften?

Ich frage mich, was der Pythonic Ansatz für die folgende Art von Methode ist, obwohl. Angenommen, ich habe die folgende Klasse:

class A(object): 
    def is_winner(self): 
     return True # typically a more arcane method to determine the answer 

Solche Methoden sind in der Regel keine Argumente und haben keine Nebenwirkungen. Man könnte diese Prädikate nennen. Und angesichts ihres Namens ähneln sie oft sehr dem, was man auch als Eigentum hätte speichern können.

Ich bin geneigt, einen @property Dekorateur zu dem oben genannten, zu geben, um der Lage zu sein, es als Objekteigenschaft zu nennen (das heißt foo.is_winner), aber ich habe mich gefragt, ob dies der Standard, was zu tun. Auf den ersten Blick konnte ich keine Dokumentation zu diesem Thema finden. Gibt es einen gemeinsamen Standard für diese Situation?

+3

Wenn es Ihre API * einfacher und sauberer macht *, dann gehen Sie auf jeden Fall für die '@ Eigenschaft'! Sie brauchen keinen Style Guide, um Ihnen das zu sagen. –

+1

Nun, die erste offensichtliche Änderung, die gemacht werden muss, um es zu Pythonic zu machen, besteht darin, Camelcasing-Methodennamen zu stoppen. – rightfold

+2

Sie möchten möglicherweise vermeiden, teure Methoden (Berechnung oder E/A) in Eigenschaften zu machen, zumindest wenn Sie sie nicht memotieren. –

Antwort

2

Es scheint der allgemeine Konsens zu sein, dass Attribute im Allgemeinen als unmittelbar und neben-frei zu verwenden angesehen werden. Wenn also die Berechnung als @Eigenschaft teuer ist, ist es wahrscheinlich am besten, das Ergebnis zwischenzuspeichern wiederholter Gebrauch (@Martijn Pieters) oder um es als Methode zu belassen, da erwartet wird, dass Methoden mehr Zeit benötigen als Attribut-Lookups. PEP 8 Noten speziell:

  • Anmerkung 2: Versuchen Sie, die funktionale Verhalten Nebenwirkung frei zu halten, obwohl Nebenwirkungen wie Caching im Allgemeinen in Ordnung sind.

  • Hinweis 3: Vermeiden Sie die Verwendung von Eigenschaften für rechenintensive Operationen; Die Attributnotation lässt den Anrufer glauben, dass der Zugang (relativ) billig ist.


Ein besonderer Anwendungsfall des @property Dekorateur ist ein bestimmtes Verhalten zu einer Klasse hinzuzufügen, ohne dass Benutzer der Klasse Wechsel von foo.bar Verweise auf foo.bar() Anrufe - zum Beispiel, wenn Sie wollten Zählen Sie, wie oft ein Attribut referenziert wurde. Sie könnten das Attribut in eine @property konvertieren, wobei die eingerichtete Methode einen bestimmten Status manipuliert, bevor die angeforderten Daten zurückgegeben werden. Hier

ist ein Beispiel der ursprünglichen Klasse:

class Cat(object): 
    def __init__(self, name): 
     self.name = name 

# In user code 
baxter = Cat('Baxter') 
print(baxter.name) # => Baxter 

Mit dem @property Dekorateur, können wir jetzt ein bisschen mehr unter der Motorhaube Maschinen ohne den Benutzer-Code zu beeinflussen:

class Cat(object): 
    def __init__(self, name): 
     self._name = name 
     self._name_access_count = 0 

    @property 
    def name(self): 
     self._name_access_count += 1 
     return self._name 

# User code remains unchanged 
baxter = Cat('Baxter') 
print(baxter.name) # => Baxter 

# Also have information available about the number of times baxter's name was accessed 
print(baxter._name_access_count) # => 1 
baxter.name      # => 'Baxter' 
print(baxter._name_access_count) # => 2 

Diese Behandlung des @property-Dekorators wurde in einigen Blog-Posts (1, 2) als einer der Hauptanwendungsfälle erwähnt - erlaubt uns, zunächst den einfachsten möglichen Code zu schreiben und dann später auf @propery-dekorated met zu wechseln wenn wir die Funktionalität brauchen.

Verwandte Themen