forma correcta de definir variables de clase en Python [duplicar]
Posible Duplicado:
Variables dentro y fuera de una clase__ init _ _ () function
Me di cuenta de que en Python, las personas inicializan sus atributos de clase de dos maneras diferentes.
El primer camino es así:
class MyClass:
__element1 = 123
__element2 = "this is Africa"
def __init__(self):
#pass or something else
El otro estilo se parece a:
class MyClass:
def __init__(self):
self.__element1 = 123
self.__element2 = "this is Africa"
¿Cuál es la forma correcta de inicializar atributos de clase?
2 answers
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 class, cambió para ambos objetos. Pero, cuando cambiamos el elemento objeto, el otro objeto se mantuvo sin cambios.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-22 06:53:14
Creo que este ejemplo 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-29 22:06:33