2012-06-06 20 views
5

Duplicar posible:
Why can't I directly add attributes to any python object?
Why can't you add attributes to object in python?¿Qué hace que los objetos definidos por el usuario no arrojen AttributeError en Python?

El siguiente código no lanza AttributeError

class MyClass(): 
    def __init__(self): 
     self.a = 'A' 
     self.b = 'B' 
my_obj = MyClass() 
my_obj.c = 'C' 

Eso contrasta con

>>> {}.a = 'A' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'a' 

¿Qué hace esa diferencia? ¿Se trata de que Dict sea una clase incorporada mientras MyClass está definido por el usuario?

+1

La verdadera pregunta es más * qué hace que algunos objetos arrojen AttributeErrors al establecer * - Python es dinámico, por lo que es natural que usted pueda hacer esto, y no al revés. –

+0

posible duplicado: http://stackoverflow.com/questions/1285269/why-cant-you-add-attributes-to-object-in-python http://stackoverflow.com/questions/1072649/python-language-question -attributes-of-object-vs-function – mgilson

+0

El primer enlace dado por mgilson arriba tiene una buena respuesta. –

Respuesta

2

La diferencia es que las instancias de las clases definidas por el usuario tienen un diccionario de atributos asociados de forma predeterminada. Puede acceder a este diccionario usando vars(my_obj) o my_obj.__dict__. Puede evitar la creación de un diccionario atributo definiendo __slots__:

class MyClass(object): 
    __slots__ = [] 

tipos incorporados también podrían proporcionar un diccionario de atributos, pero por lo general no lo hacen. Un ejemplo de un tipo incorporado que hace atributos de soporte es el tipo de una función.

Cuestiones relacionadas