2016-04-23 18 views
0

Während "spielen" mit OOP-Paradigma in Python stieß ich auf einige Missverständnisse. Lassen Sie uns etwas kleines Beispiel sehen:Erstellen und Vergleichen von Klasseninstanzen ohne Variablenzuweisung in Python

class A(object): 
    pass 

print id(A()), id(A()) # 139865221604432 139865221604432 
print id(A()) == id(A()) # True 
print A() is A()   # False 
a1 = A()     
print id(a1)    # 139865221604432 
a2 = A() 
print id(a2)    # 139865220638096 

Die Frage ist also, warum die ID-Nummer für den ersten Druck Beispiel die gleiche für beide Instanzen ist. Wenn wir einen Blick auf A() is A() werfen, können wir sehen, dass alles "ok" ist und das Ergebnis falsch ist. Nicht sicher, aber kann es mit der Müllsammlung zu tun haben?

Ein weiteres Beispiel:

class B(object): 

    def __init__(self): 
     self.msg = 'Some default message' 
     print id(self) 

    def do_smth(self, msg): 
     self.msg = msg 

    def get_msg(self): 
     return self.msg 

Dann haben wir zwei Fälle.

1. Platz:

B().do_smth(B().get_msg() + ' add') 

2.

b = B() 
b.do_smth(b.get_msg() + ' add') 

Soweit ich der zweite Ansatz verstehen, viel mehr zu bevorzugen ist, weil wir zwei Instanzen erstellen, nicht wie in der ersten . Aber gibt es interessante Fälle, in denen wir den ersten Ansatz erreichen können?

Antwort

0

Vom Python documentation für die id Funktion ...

Zwei Objekte mit nicht-überlappenden Lebensdauern kann die gleiche ID() Wert haben.

Wenn Sie

print id(A()), id(A()) 

tun druckt es die gleiche ID für jedes Objekt, weil das erste Objekt den Gültigkeitsbereich gegangen. Jede Instanz von A, die Sie erstellt haben, existiert nur so lange, wie der Aufruf von id dauert. Sobald die Variable den Gültigkeitsbereich verlässt, kann sie gesammelt und ihre ID wiederverwendet werden. Sobald Sie das Objekt einer Variablen zuweisen, die nicht wiederverwendet werden kann, bis die Variable den Gültigkeitsbereich verlässt.

In Ihrem zweiten Beispiel ist der Grund, dass die zweite Form gegenüber der ersten bevorzugt wird, dass sich Objektinstanzen normalerweise in ihrem Zustand unterscheiden. Ihr erstes Formular funktioniert nur wirklich, weil alle Instanzen von B die gleichen Werte haben - und das ist eine ungewöhnliche Eigenschaft für eine Klasse. Es ist jedoch erwähnenswert, dass es in der Regel nicht die beste Praxis ist, ein Objekt nach Daten zu fragen und diese dann als Methodenargument an das Objekt zurückzugeben.