La forma pythonica de acceder a un atributo de clase dentro de la clase

Me preguntaba cómo crees que es la forma de acceder a un atributo de clase desde una función dentro de la clase. No he encontrado una referencia en PEP8 o una pregunta popular al respecto. p.ej

class MyClass(object): BAR = 1 def foo(self): # Way A: print(self.BAR) # Way B: print(MyClass.BAR) 

El acceso a través de ‘ego’ parece razonable, ya que el atributo es propiedad de la misma clase, referencia cercana para referencia obvia de la misma clase. Por otro lado, el acceso a través del nombre de la clase en sí es claro, ya que es estático y aclara el origen del uso y también podría ser más claro, ya que se empareja con el nombre de la clase.

Al nombrar explícitamente el nombre de la clase, evita que la subclase anule su atributo.

Por otro lado, el uso del yo te da esta flexibilidad . Considere el siguiente código:

 class MyClass(object): BAR = 1 def foo(self): # Way A: print(self.BAR) # Way B: print(MyClass.BAR) class SubClass(MyClass): BAR = 2 class SubClass2(MyClass): pass # output >>> a = SubClass() >>> a.foo() 2 1 >>> b = SubClass2() >>> b.foo() 1 1 

Para las lecturas, realmente no importa lo que use: self.BAR y MyClass.BAR son sintácticamente equivalentes, a menos que tenga una jerarquía de clases en la que una subclase redefine el valor de BAR .

Para las escrituras no son lo mismo. Escribir en self.BAR creará efectivamente una nueva variable que es local para la instancia de self objeto, por lo que cualquier lectura de self.BAR de otra instancia de objeto no verá las modificaciones. Estos pueden ser bastante difíciles de depurar porque no es obvio en el código lo que debería suceder, ya que es sensible al tiempo.

En general, para las variables de clase, realmente debería utilizar MyClass.BAR si desea una variable específica de un nivel específico en la jerarquía de clases, o type(self).BAR o self.__class__.BAR si desea algo que sea seguro para la herencia. Esto es específicamente y, obviamente, una variable de clase y evita el problema descrito anteriormente con los alias dynamics que aparecen en el tiempo de ejecución. Usar el self solo sirve para hornear en una fragilidad que puede ser difícil de detectar en el futuro.