2012-05-10 20 views
5

Estoy aprendiendo Python, y estoy tratando de entender mejor los descriptores. Cuando miro a este libro en línea Python: http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html, que dice:Descriptores y atributos provistos por Python

  1. Si attrname es una (siempre en Python es decir) atributo especial para objectname, devolverlo.

No entiendo qué significa Python-provided. ¿Puede alguien darme un ejemplo de dicho atributo proporcionado por Python que tendría prioridad sobre el orden de resolución habitual?

Nota: Solo me interesan las clases de nuevo estilo (ya que las descripciones ni siquiera se aplican al estilo antiguo hasta donde yo sé).

Respuesta

0

Como has adivinado, el paso 1 es lisa y llanamente equivocado y no existe.

1

__class__, por ejemplo:

>>> 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>}) 
>>> 

equivalente en estilo antiguo-clases:

>>> 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> 

mientras

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

Hay muchos nombres de atributos especiales más, dependiendo de la tipo de objeto Por ejemplo, las funciones de:

>>> 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' 

ver http://docs.python.org/reference/datamodel.html para una visión general

+0

No me había dado cuenta de esto antes, pero la modificación directa de un '__dict__' de una clase no parece funcionar con las clases de estilo nuevo - resulta en el objeto' TypeError: 'dict_proxy' no admite la asignación de elementos'. Todavía puede ver el comportamiento anterior en Python 3 modificando el '__dict__' de la instancia, es decir' test .__ dict __ ["__ class__"] = "spam" '. Además, ¿sabes qué otros atributos funcionan así? El único otro que he encontrado es '__dict__' en sí mismo. – James

+0

@James ver la actualización – ch3ka

+0

Mi pregunta era acerca de las clases de estilo nuevo, lo que demuestra solo funciona en estilo antiguo. – Flavien

Cuestiones relacionadas