resueltos programacion poo polimorfismo orientada objetos objeto importar herencia ejercicios ejemplo definir como clases python class attributes

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.