2010-07-24 15 views
7

vengo de experiencia en C++ a Pythonmiembros Declarar solamente en el constructor

he estado declarando variables miembro y colocarlos en una forma de C++ esqe este modo:

class MyClass: 
    my_member = [] 

    def __init__(self,arg_my_member): 
     self.my_member = arg_my_member 

Entonces notado en algún código fuente abierto, que la declaración inicial my_member = [] se dejó completamente y solo se creó en el constructor.

Lo que obviamente es posible ya que python es dinámico.

Mi pregunta es, ¿es esta la forma preferida o Pythonic de hacer las cosas, y existen y pros y contras de cualquiera de las dos?

Respuesta

9

La forma en que lo hace significa que ahora tendrá un miembro "estático" y un miembro "no estático" del mismo nombre.

class MyClass: 
    my_member = [] 

    def __init__(self, arg_my_member): 
     self.my_member = arg_my_member 


>>> a = MyClass(42) 
>>> print a.my_member 
42 
>>> print MyClass.my_member 
[] 
4

Si lo define dentro de la clase, entonces es una variable de clase y si la define dentro del constructor es una variable de objeto. Así que si no lo defines dentro del constructor TODAS las instancias de la clase comparten la misma variable de clase.

0

Esto crea un atributo de clase llamada my_member

class MyClass: 
    my_member = [] 

Si los casos no tienen una variable de instancia llamada my_member, todas las instancias tendrían acceso a la lista misma a través de self.my_member.

Dado que está creando una variable de instancia llamada my_member es muy probable que la variable de clase nunca se usa y es sólo un signo de confusión

-1

Estos son dos cosas diferentes. my_member es una variable de clase (como un miembro de clase estática en C++ y amigos) porque se crea a nivel de clase. Puede acceder a él como instancia.mi_miembro, pero se comparte en todas las instancias (y, por lo tanto, es mejor que lo haga referencia como cls.mi_miembro). Estableciéndolos en __init__ como self.my_member crea un miembro "real" (una variable de instancia) para cada instancia.

1

Ambas formas son aceptables para python, excepto en el caso de valores mutables. Cuando se declara que al igual que en el ejemplo, se puede obtener un resultado muy inesperado:

>>> class MyClass: 
...  my_member = [] 
... 
>>> A = MyClass() 
>>> B = MyClass() 
>>> A.my_member.append(1) 
>>> A.my_member 
[1] 
>>> B.my_member.append(2) 
>>> B.my_member 
[1, 2] 
>>> A.my_member 
[1, 2] 
>>> MyClass.my_member 
[1, 2] 

Desde miembros de la clase se generan sólo una vez, cuando la clase en sí se está procesando al cargar el módulo. Si su miembro está destinado a ser utilizado en el ámbito de instancia, debe configurarlo en __init__

Los valores inmutables están bien aunque.

Cuestiones relacionadas