variable method classmethod python class static attributes

method - static class python



¿Cómo declarar un atributo estático en Python? (5)

Los atributos estáticos son atributos de datos en Python. Para que los atributos asignados en clase:

>>>class A(object): >>> a = 1 >>>A.a >>>1

Esto es diferente de C ++ y Java, donde no se puede acceder a un miembro estático usando una instancia:

>>>inst = A() >>>inst.a 1 >>>

El método incorporado setattr lo ayudará a establecer una static variable(data attribute) .

>>>setattr(A, ''b'', 2) >>>A.b >>>inst.b

¿Cómo puedo declarar un atributo estático en Python?

Aquí está escrito cómo puedo declarar un método: ¿ Métodos estáticos en Python?


Puede utilizar el decorador de propiedad @ estándar para hacer un atributo estático:

class A(object): @property def a(self): return 1 a = A() print a.a 1 a.a = 2 AttributeError: can''t set attribute


Solo para agregarlo, también puede tener variables estáticas en las funciones, no solo las clases:

def some_fun(): some_fun.i += 1 print(some_fun.i) some_fun.i = 0; print(some_fun(), some_fun(), some_fun()) # prints: 1,2,3


Todas las variables declaradas dentro de la clase ''cuerpo son atributos'' estáticos ''.

class SomeClass: # this is a class attribute some_attr = 1 def __init__(self): # this is an instance attribute self.new_attr = 2

Pero tenga en cuenta que la parte ''estática'' es por convención, no impuesta (para más detalles sobre esto, lea este subproceso SO ).

Para más detalles de esta convención y sus implicaciones, aquí hay un extracto rápido de la documentación oficial :

Las variables de instancia "privadas" a las que no se puede acceder, excepto desde dentro de un objeto, no existen en Python. Sin embargo, hay una convención seguida por la mayoría del código de Python: un nombre con un guión bajo (p. Ej. _Spam) debe tratarse como una parte no pública de la API (ya sea una función, un método o un miembro de datos) . Debe considerarse un detalle de implementación y está sujeto a cambios sin previo aviso.

Dado que existe un caso de uso válido para los miembros de clase privada (es decir, para evitar choques de nombres de nombres con nombres definidos por subclases), existe un soporte limitado para dicho mecanismo, llamado "denominación de nombres". Cualquier identificador de la forma __spam (al menos dos guiones bajos, a lo sumo un guión bajo) se reemplaza textualmente con _classname__spam, donde nombre de clase es el nombre de la clase actual con el subrayado (s) destacado (s) eliminado. Esta mutilación se realiza sin tener en cuenta la posición sintáctica del identificador, siempre que ocurra dentro de la definición de una clase.


Todas las variables definidas en el nivel de clase en Python se consideran estáticas

class Example: Variable = 2 # static variable print Example.Variable # prints 2 (static variable) # Access through an instance instance = Example() print instance.Variable # still 2 (ordinary variable) # Change within an instance instance.Variable = 3 #(ordinary variable) print instance.Variable # 3 (ordinary variable) print Example.Variable # 2 (static variable) # Change through Class Example.Variable = 5 #(static variable) print instance.Variable # 3 (ordinary variable) print Example.Variable # 5 (static variable)

Puede tener dos variables diferentes en su clase con el mismo nombre (una estática y una ordinaria). No se confunda