programacion - forma correcta de definir las variables de clase en Python
programacion orientada a objetos python pdf (2)
Posible duplicado:
Variables dentro y fuera de una clase __init __ () función
Noté que en Python, las personas inicializan sus atributos de clase de dos maneras diferentes.
La primera forma es así:
class MyClass:
__element1 = 123
__element2 = "this is Africa"
def __init__(self):
#pass or something else
El otro estilo se ve así:
class MyClass:
def __init__(self):
self.__element1 = 123
self.__element2 = "this is Africa"
¿Cuál es la forma correcta de inicializar los atributos de clase?
Ambas formas no son correctas o incorrectas, son solo dos tipos diferentes de elementos de clase:
- Los elementos fuera del método
__init__
son elementos estáticos, es decir, pertenecen a la clase. - Los elementos dentro del método
__init__
son elementos del objeto (self
), no pertenecen a la clase.
Lo verás más claramente con algún código:
class MyClass:
static_elem = 123
def __init__(self):
self.object_elem = 456
c1 = MyClass()
c2 = MyClass()
# Initial values of both elements
>>> print c1.static_elem, c1.object_elem
123 456
>>> print c2.static_elem, c2.object_elem
123 456
# Nothing new so far ...
# Let''s try changing the static element
MyClass.static_elem = 999
>>> print c1.static_elem, c1.object_elem
999 456
>>> print c2.static_elem, c2.object_elem
999 456
# Now, let''s try changing the object element
c1.object_elem = 888
>>> print c1.static_elem, c1.object_elem
999 888
>>> print c2.static_elem, c2.object_elem
999 456
Como puede ver, cuando cambiamos el elemento de clase, cambió para ambos objetos. Pero, cuando cambiamos el elemento objeto, el otro objeto permaneció sin cambios.
Creo que esta muestra explica la diferencia entre los estilos:
james@bodacious-wired:~$cat test.py
#!/usr/bin/env python
class MyClass:
element1 = "Hello"
def __init__(self):
self.element2 = "World"
obj = MyClass()
print dir(MyClass)
print "--"
print dir(obj)
print "--"
print obj.element1
print obj.element2
print MyClass.element1 + " " + MyClass.element2
james@bodacious-wired:~$./test.py
[''__doc__'', ''__init__'', ''__module__'', ''element1'']
--
[''__doc__'', ''__init__'', ''__module__'', ''element1'', ''element2'']
--
Hello World
Hello
Traceback (most recent call last):
File "./test.py", line 17, in <module>
print MyClass.element2
AttributeError: class MyClass has no attribute ''element2''
element1 está vinculado a la clase, element2 está vinculado a una instancia de la clase.