2011-10-18 24 views

Respuesta

49

Si desea que el atributo de ser compartida por todas las instancias de la clase, utilizar un atributo de clase:

class A(object): 
    foo = None 

Esto hace que ('foo',None) para ser un (key,value) par en A.__dict__.

Si desea que el atributo sea adaptable en una base por ejemplo, usar un atributo de instancia:

class A(object): 
    def __init__(self): 
     self.foo = None 

Esto hace que ('foo',None) ser un par (key,value) en a.__dict__ donde a=A() es una instancia de A.

+1

tiene sentido, pensé que estaban limitados a la instancia en ambos casos ... gracias :) – fortran

+6

Python tiene un complicado conjunto de [reglas de búsqueda de atributos] (http://www.cafepy.com/article/python_attributes_and_methods/ python_attributes_and_methods.html). Sin entrar en las descripciones, para este caso basta con saber que 'a .__ dict__' se busca primero la tecla' foo', y si no se encuentra allí, entonces se busca 'A .__ dict__'. Es por eso que puedes usar 'a.foo' incluso si' foo' es un atributo de clase. – unutbu

+1

También cabe destacar que para los atributos de clase, si hiciera 'a.foo = whatever', en realidad terminaría creando un nuevo atributo de instancia (que oculta el atributo de clase). 'A.foo' no se modificará. Es un poco complicado, ya que puedes acceder al valor de 'A.foo' con' a.foo', pero asignarlo crearía un nuevo atributo de instancia. – Kat

2

Los atributos definidos en la definición de clase se consideran variables de clase (como variables estáticas en Java), mientras que los establecidos en el inicializador son atributos de instancia (tenga en cuenta la diferencia entre self.something = 1 y something = 1). Vea this question para más detalles, y this one para aún más. No hay mucha diferencia práctica entre estos dos casos, ya que la definición de nivel de clase le da al atributo un valor predeterminado, pero si desea usar algún tipo de lógica para establecer un atributo antes de usar una instancia de objeto, debe hacerlo en el método __init__().

Cuestiones relacionadas