2013-12-13 10 views
6

Ok Ich habe gelesen, über die Verwendung der @property Dekorator in Python anstatt spezifische Methoden zum Abrufen, Einstellen und Löschen. Ein Beispielcode ist unten gezeigt.Getter, Setter und Deleter in Python automatisch setzen

Wie Sie sehen können, ist der Großteil des Codes im Beispiel der Definition der Methoden gewidmet.

Meine Frage ist, ob es eine Möglichkeit gibt, Getter, Setter und Deleter für jede meiner Variablen automatisch zuzuordnen? In meinem tatsächlichen Code habe ich viel mehr Variablen und es scheint wie eine Menge repetitive Code-Einstellung für jede Methode.

Ich erkenne, dass es für einfache Fälle nicht unbedingt notwendig ist, aber ich würde lieber die Methoden in jetzt, für den Fall, dass ich jemals beschließen, die Komplexität der Klasse zu erhöhen.

+3

* "Ich würde es jedoch vorziehen, die Methoden jetzt zu programmieren, falls ich jemals die Komplexität der Klasse erhöhen möchte." * - warum fügst du sie nicht hinzu, wenn du sie brauchst? Implementiere nur das, was du * jetzt * brauchst, und korrigiere es, wenn dein Code wächst. Alles, was Sie jetzt hinzufügen, um eine Erweiterung oder ein Feature zu unterstützen, die möglicherweise auftreten oder nicht, ist nur Rauschen. –

Antwort

3

Halten Sie es einfach.

Wenn Sie Funktionen wie diese haben, verwenden Sie einfach eine öffentlich zugängliche Variable. Das ist:

class Person(object): 
    def __init__(self): 
     self.firstName = None 
     self.lastName = None 
     self.age = None 

ist völlig in Ordnung. Ein besserer Ansatz der Nutzung gegeben ist, die Daten als Teil des Konstrukteurs zu verlangen, also:

class Person(object): 
    def __init__(self, firstName, lastName, age): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.age = None 

person = Person('Peter', 'Smith', 21) 

Wenn Sie besorgt sind, welche Name ist die, Sie immer spezifisch sein können:

person = Person(firstName='Peter', lastName='Smith', age=21) 

In die Zukunft, wenn Sie es komplizierter machen müssen, können Sie Getter/Setter wo erforderlich hinzufügen.

Eine weitere Überlegung ist, dass der Konstruktor gegeben, Sie einen String-Umwandlungsfunktion auf dem Person Objekt erstellen:

person = Person(firstName='Peter', lastName='Smith', age=21) 
print(person) 

, so dass Sie don:

def __str__(self): 
    return ' '.join([self.firstName, self.lastName]) 

Dieses dann es Ihnen gefällt verwenden können Ich muss nicht wissen, wie es intern umgesetzt wird.

Eine weitere Überlegung ist, dass chinesische/japanische Namen den Nachnamen zuerst setzen, Personen können mehrere Nachnamen haben (besonders in Spanien) und können Zweitnamen haben.

2

Der springende Punkt des Property Decorator ist so, dass Sie nicht brauchen, um es von Anfang an zu definieren. Der direkte Zugriff auf ein Attribut hat genau die gleiche Syntax wie der Zugriff auf ein Attribut über eine Eigenschaft. Sie sollten es also vollständig weglassen, bis Sie tatsächlich die komplexe Logik haben und erst dann zu Eigenschaften wechseln.

0

Manuelle Setter und Deleter-Definition ist eine explizite Art zu sagen "Ich verbrachte viel Zeit beim Erstellen dieser Schnittstelle, und Sie können diese Eigenschaft einstellen, löschen und erhalten, ohne Bedenken, Code zu brechen".

Andernfalls können Sie einfach Instanzvariablen ohne den Property Decorator verwenden.

def __init__(self): 

    self.firstName = None 
    self.lastName = None 
    self.age = None 

Auf einer Seite zur Kenntnis, möchten Sie wahrscheinlich einen Blick auf PEP-8 für pythonic Variablennamen und Code Styling Konventionen nehmen.