2016-03-30 3 views
0

Ich bin nicht sehr vertraut mit Python, also, als ich diesen Code traf, gibt es ein paar Dinge nicht ganz klar für mich. Hier ist der Code:Instanz undefinierte Parameter in Python

class TypeVariable(object): 
    #A type variable standing for an arbitrary type. 
    #All type variables have a unique id, but names are only assigned lazily, 
    #when required. 

    next_variable_id = 0 

    def __init__(self): 
     self.id = TypeVariable.next_variable_id 
     TypeVariable.next_variable_id += 1 
     self.instance = None 
     self.__name = None 

    next_variable_name = 'a' 

    @property 
    def name(self): 
     #Names are allocated to TypeVariables lazily, so that only TypeVariables present 
     if self.__name is None: 
      self.__name = TypeVariable.next_variable_name 
      TypeVariable.next_variable_name = chr(ord(TypeVariable.next_variable_name) + 1) 
     return self.__name 

Warum def __init__(self): nicht name als Parameter haben, aber in den obigen Code ist es self.__name = None?

Auch was bedeutet self.instance bedeuten, weil ich nicht erinnere, dass es ein Attribut namens Instanz gibt.

Kann mir bitte jemand helfen, zu verstehen, was dieser Code tut, und ob eine Java-Version zur Verfügung gestellt werden kann, wird sehr geschätzt, da ich Java besser kenne. Danke

Antwort

0
self.instance = None 
self.__name = None 

Es gibt nur Objektattribute mit Standardwert. Sie müssen sie nicht in die Parameter __init__() eingeben, wenn sie für die Erstellung der Klasseninstanz nicht benötigt werden.

+2

'self .__ name' wird mindestens benötigt, da die '@ property' annimmt, dass sie existiert. Die Implementierung von 'name' müsste sich ändern, wenn nicht garantiert wäre, dass sie in' _init__' initialisiert wird. – ShadowRanger

3

Der Code hat keinen Kontext zu sagen, was self.instance sein könnte. Wie für self.__name, die property Definition macht klar, dass es sequenzielle Namen Instanzen zulässt. Es setzt __name auf None so dass es weiß, dass es nicht initialisiert wurde; Wenn auf self.name zugegriffen wird, erkennt es den Platzhalter, ersetzt es durch einen neuen Wert und gibt den neuen Wert zurück.

Beachten Sie, dass die Angabe einer Zuweisung für alle Instanzattribute in __init__ in Python als gute Form betrachtet wird, da es sonst sehr schwierig sein kann herauszufinden, welche Attribute eine Instanz haben könnte. Und im modernen Python (3.3 und höher) erhalten Sie dadurch eine Speicherersparnis; Solange alle Attribute in __init__ initialisiert werden und nach __init__ keine neuen Attribute hinzugefügt werden, ist die __dict__ für alle Instanzen eine key-sharing dictionary, die die Kosten jeder Instanz erheblich reduziert (um etwa zwei Drittel, obwohl dies ein Implementierungsdetail ist). Wenn also eine andere Methode/Eigenschaft instance später festlegen würde, ist es am besten, sie in __init__ zu initialisieren, damit die Betreuer wissen, was sie haben soll, und den Speicherverbrauch in Py3.3 + reduziert.

+0

Hallo, kann ich das 'def __init __ (self)' als Konstruktor in Java betrachten, wenn ja, wie kann es Operationen im Konstruktor hinzufügen –

+1

@AndaZhao: Technisch gesehen ist '__init__' ein Initialisierer; Das Rohobjekt wird erstellt, bevor es aufgerufen wird (so erhält man "self"). Python hat ein "__new__", das konstruiert (und auch initialisiert werden kann), aber es wird normalerweise nur für logisch unveränderliche Objekte verwendet ('__init__' kann mehr als einmal aufgerufen werden, was die Unveränderlichkeit verletzen würde) oder Objekte im Cache/Singleton (' __new__' können) ein vorhandenes Objekt zurückgeben, nicht nur neue erstellen). In jedem Fall definiert Python im Gegensatz zu Java jedoch Instanzattributnamen im Allgemeinen nicht im Voraus; Sie können jedes Attribut jederzeit definieren. – ShadowRanger