2017-03-07 5 views
1

Welcher der folgenden Fälle ist die Best Practice Möglichkeit, eine Instanzvariable in Python zu deklarieren. Gibt es eine typische Präferenz und was sind die Gründe dafür?wo Objektvariable deklarieren

Option 1 - Declare innerhalb __init__

class MyObject: 

    def __init__(self, arg): 
     self.variable_1 = self.method_1(arg) 

    def method_1(self, arg): 
     return(arg) 

Option 2 - festzustellen, in anderen Verfahren

class MyObject: 

    def __init__(self, arg): 
     self.method_1(arg) 

    def method_1(self, arg): 
     self.variable_1 = arg 

Diese rein ist, zu verstehen, wenn es ein Best-Practice-Weg, dies zu tun ist Andere Entwickler würden es bevorzugen, wenn sie Code überprüfen und erweitern.

+0

Option 1. Sie sollten alle Attribute in "__init__" deklarieren, weil dort jemand nach ihnen sucht. –

+0

Die allgemeine Regel in OOP (unabhängig von der Programmiersprache) ist der Konstruktor ist wie ein Zuweisungsoperator bedeutet in __init__ sollten wir die Werte der Instanzvariablen zuweisen. Also ich denke, wir sollten die Werte in __init__ zuweisen und Getter und Setter sollten davon getrennt werden. –

+2

Ich entschuldige mich für pedantisch, aber Instanzvariablen sind nicht in Python deklariert. Sie [entstehen] (https://docs.python.org/3.3/tutorial/classes.html#instance-objects), wenn sie zum ersten Mal zugewiesen werden. Die Variablendeklaration existiert in Sprachen wie C++ und Java, nicht in Python. –

Antwort

0

Dies ist offensichtlich keine exakte Wissenschaft, aber es macht im Allgemeinen Sinn, alle Attribute (wie möglich) im Konstruktor zu setzen, so dass Sie sie verfolgen können.

Sie können diese natürlich später bei Bedarf in anderen Methoden ändern.

Die Einstellung von Konstruktor-Level-Variablen überall in der Klasse macht es sehr schwer zu verstehen, woher die Dinge kommen.

0

Option 1 empfiehlt, die Instanzvariable in Python zu deklarieren. Instanzvariablen sind für Daten, die tatsächlich Teil der Instanz sind, daher wäre es besser, wenn Sie im Konstruktor definieren.

0

Ihre Option 2 ist im Grunde ein Setter-/Getter-Paradigma. Python verwendet Eigenschaften für diese Anwendungsfälle. Es gibt eine nette SO-answer für eine ähnliche Frage.

Im Allgemeinen initialisieren Sie alle Ihre Instanz-Variablen in der __init__ -Methode, das ist der Grund zu existieren. Wenn Sie einen Getter-/Setter benötigen, verwenden Sie Eigenschaften. Und benutze das Prinzip des "geringsten Erstaunens". Überraschen Sie nicht einen anderen Leser oder Ihr späteres Selbst mit übermäßig schlauen und/oder komplizierten Lösungen. (aka KISS Prinzip)

0

Kommt drauf an. Das Definieren aller Attribute innerhalb von __init__ selbst macht den Code normalerweise lesbarer, aber wenn die Klasse viele Attribute hat und Sie sie leicht in logische Gruppen aufteilen können, ist es sinnvoll, jede Gruppe von Attributen in ihrer eigenen Initialisierungsmethode zu initialisieren. Sie können angeben, dass diese Methoden private sind, indem Sie ihnen einen Namen geben, der mit einem einzelnen Unterstrich beginnt.

Hinweis: Wenn die Klasse von einer oder mehreren anderen Klassen (außer object) abgeleitet ist, müssen Sie super.__init__ aufrufen, um die von der übergeordneten Klasse übernommenen Attribute zu initialisieren.

Die Quintessenz ist, dass alle Instanzattribute zu der Zeit existieren sollten, in der __init__ die Ausführung beendet. Wenn es nicht möglich ist, einen geeigneten Wert für ein Attribut in __init__ zu setzen, sollte es auf einen geeigneten Standardwert gesetzt werden, z. B. eine leere Zeichenfolge, Liste usw. None oder ein Sentinel-Wert wie object().

Natürlich gilt das obige nicht für @property Attribute, aber selbst diese werden im Allgemeinen ein zugrunde liegendes "private" Attribut haben, das in __init__ gesetzt werden sollte.

Weitere Informationen über Eigenschaften finden Sie unter Raymond Hettinger 's hervorragende Descriptor HowTo Guide in den Python-Dokumenten.


Wie juanpa.arrivillaga in der Frage Kommentare erwähnt, wissen wir nicht wirklich erklären Variablen in Python. Das liegt im Grunde daran, dass das Python-Datenmodell nicht wirklich Variablen wie C und viele andere Sprachen hat. Eine kurze Erklärung mit schönen Diagrammen finden Sie unter Other languages have "variables", Python has "names". Siehe auch Facts and myths about Python names and values, die von SO-Veteran Ned Batchelder geschrieben wurde.

Verwandte Themen