2017-07-25 3 views
1

Warum funktioniert das:macht __dict__ Eine Immobilie

class Bunch(dict): 

    def __init__(self, *args, **kwargs): 
     super(Bunch, self).__init__(*args, **kwargs) 
     self.__dict__ = self 

b = Bunch() 
b["a"] = 1 
print(b.a) 

wenn auch mit einer kreisförmigen Referenz:

import sys 
print(sys.getrefcount(b)) 
# ref count is 3 when normally it is 2 

Aber nicht dies:

class Bunch(dict): 

    @property 
    def __dict__(self): 
     return self 

b = Bunch() 
b["a"] = 1 
b.a 

# raises AttributeError 

Während __dict__ ist ein Attribut von den meisten Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es gibt ein spezielles Verhalten, das hinter den Kulissen implementiert wird, das die Deskriptor-Logik erstellt von der property.

+0

Denken Sie an 'self .__ dict__ = self'. Offensichtlich kann das * nicht äquivalent zu "self .__ dict __ ['__ dict__'] = self" sein, oder? So muss "selbst .__ dict__" magisch sein. – Kevin

+0

@OferSadan: Nein, Funktion oder nicht ist egal, und es ist sowieso keine Funktion im zweiten Beispiel. – user2357112

Antwort

2

Das Standard- Attribut bereits im Wesentlichen ist eine Eigenschaft. (Es ist nicht buchstäblich ein property, aber es wird durch das Deskriptor-Protokoll implementiert, ebenso wie property.)

Wenn Sie self.__dict__ = self gesetzt, das geht durch den __set__ Methode des __dict__ Descriptor und ersetzt die dict verwenden zum Beispiel Attribute.

Python verwendet jedoch nicht den Deskriptor __dict__, um das Instanzdikt beim Ausführen von Attributoperationen zu finden. Es verwendet einen anderen internen Mechanismus. Daher wirkt sich das Erstellen Ihres eigenen Deskriptors nicht auf den Attributsuchmechanismus für b.a in Ihrem zweiten Beispiel aus.

Verwandte Themen