2012-05-10 7 views
5

Ich lerne Python, und ich versuche, Deskriptoren besser zu verstehen. Als ich an diesem Python Online-Buch aussehen: http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html, heißt es:Deskriptoren und Python-Attribute zur Verfügung gestellt

  1. Wenn attrname ein besonderes ist (das heißt Python-zur Verfügung gestellt) Attribut für objektname, gibt es zurück.

Ich verstehe nicht, was Python bedeutet. Kann mir jemand ein Beispiel für ein solches von Python bereitgestelltes Attribut geben, das Vorrang vor der üblichen Auflösungsreihenfolge hat?

Hinweis: Ich bin nur an neuartigen Klassen interessiert (die Deskriptoren gelten, soweit ich weiß, nicht einmal für den alten Stil).

Antwort

0

Wie Sie vielleicht erraten, Stufe 1 ist schlichtweg falsch und nicht existiert.

1

__class__, zum Beispiel:

>>> class Test(object): 
    __dict__ = {'__class__' : "dict of Test"} 
    def __init__(self): 
     self.__dict__['__class__'] = "dict of test" 


>>> test = Test() 
>>> test.__class__ 
<class '__main__.Test'> 
>>> test.__dict__ 
{'__class__': 'dict of test'} 
>>> Test.__dict__ 
dict_proxy({'__dict__': {'__class__': 'dict of test'}, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'Test' objects>, '__doc__': None, '__init__': <function __init__ at 0x02BD2770>}) 
>>> 

Äquivalent in alten Stil-Klassen:

>>> class Test: 
     pass 

>>> Test.__dict__["__class__"] = "spam" 
>>> test = Test() 
>>> test.__class__ 
<class __main__.Test at 0x02BD1110> 
>>> test.__dict__ = {'__class__': "foo"} 
>>> test.__class__ 
<class __main__.Test at 0x02BD1110> 

während

>>> test.__dict__ = {'__lolcat__': "bar"} 
>>> test.__lolcat__ 
'bar' 

Es gibt viele weitere spezielle Attributnamen, auf die je Art des Objekts. Zum Beispiel Funktionen:

>>> def test():pass 

>>> dir(test) 
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name'] 
>>> test.func_closure 
>>> test.__dict__['func_closure']='roflcopter' 
>>> test.func_closure 
>>> test.__dict__['foo']='bar' 
>>> test.foo 
'bar' 

siehe http://docs.python.org/reference/datamodel.html für eine Übersicht

+0

Ich habe das vorher nicht bemerkt, aber das direkte Ändern eines '__dict__' einer Klasse scheint nicht mit neuen Stilklassen zu funktionieren - es führt zu' TypeError: 'dict_proxy' Objekt unterstützt keine Elementzuweisung'. Sie können das obige Verhalten in Python 3 immer noch sehen, indem Sie das '__dict__' der Instanz ändern, d. H.' Test .__ dict __ ["__ class__"] = "spam" '. Wissen Sie auch, welche anderen Attribute so funktionieren? Der einzige andere, den ich gefunden habe, ist "__dict__" selbst. – James

+0

@James siehe Update – ch3ka

+0

Meine Frage war über neue-Stil-Klassen, was Sie demonstrieren funktioniert nur im alten Stil. – Flavien

Verwandte Themen