2010-08-13 30 views
10

Estoy escribiendo scripts de Python para Blender para un proyecto, pero soy bastante nuevo en el lenguaje. Algo de lo que estoy confundido es el uso de variables estáticas. Aquí está la pieza de código Actualmente estoy trabajando en:Herencia variable estática en Python

class panelToggle(bpy.types.Operator): 
    active = False 

    def invoke(self, context, event): 
     self.active = not self.active 
     return{'FINISHED'} 

class OBJECT_OT_openConstraintPanel(panelToggle): 
    bl_label = "openConstraintPanel" 
    bl_idname = "openConstraintPanel" 

La idea es que la segunda clase debe heredar el activa variable y el invocar el método de la primera, por lo que llamar OBJECT_OT_openConstraintPanel.invoke () cambia OBJECT_OT_openConstraintPanel.active. Sin embargo, el uso de auto como lo hice anteriormente no funcionará, y tampoco lo hace el uso del panel Talk. ¿Alguna idea de cómo hago esto?

+0

bien, parece que puedo utilizar self.__class__.active o tipo (auto) .active dejar que el método heredan correctamente. ¡Gracias! – gibberish

+0

¿Por qué está usando variables estáticas en primer lugar? Eso no parece sensato. ¿Es este atributo 'activo' algún tipo de instancia global, compartida entre todas las instancias' PanelToggle'? Si es así, ¿por qué no es realmente global? ¿O por qué no está en algún objeto compartido más global? –

+0

Quiero que cada subclase de PanelToggle tenga su propia variable "activa" a la que se puede acceder sin crear una instancia. Si entiendo correctamente el uso de la palabra clave "global", tendría que insertar una línea 'global active' primero en 'invoke (..)' antes de usar active como una variable local. Hacer esto da un error al decir que el nombre global 'activo' no está definido. No estoy seguro de entender lo que está mal con mi enfoque, sin embargo. – gibberish

Respuesta

17

uso type(self) para acceder a atributos de clase

>>> class A(object): 
var = 2 
def write(self): 
    print type(self).var 
>>> class B(A): 
pass 
>>> B().write() 
2 
>>> B.var = 3 
>>> B().write() 
3 
>>> A().write() 
2 
+2

es 'type (self)' de alguna manera diferente de usar 'self .__ class__'? – jorelli

+3

No es por el momento. Pero algunas características se pueden implementar más adelante. También puedes hacer algún parche de mono para escribir la función. – Odomontois

2

Puede acceder active través de la clase a que pertenece:

if panelToggle.active: 
    # do something 

Si desea acceder a la variables clase a partir de un método, se podría escribir:

def am_i_active(self): 
    """ This method will access the right *class* variable by 
     looking at its own class type first. 
    """ 
    if self.__class__.active: 
     print 'Yes, sir!' 
    else: 
     print 'Nope.' 

Un ejemplo de trabajo se puede encontrar aquí: http://gist.github.com/522619


La variable self (llamada self por convenio) es la instancia actual de la clase, implícitamente aprobada pero recibida explícitamente.

class A(object): 

    answer = 42 

    def add(self, a, b): 
     """ ``self`` is received explicitely. """ 
     return A.answer + a + b 

a = A() 

print a.add(1, 2) # ``The instance -- ``a`` -- is passed implicitely.`` 
# => 45 

print a.answer 
# => print 42 
+0

Sí, pero quiero poder hacer lo mismo con OBJECT_OT_openConstraintPanel. Quiero que tenga su propia variable "activa" estática, heredada de panelToggle. También quiero hacer que el método "invocar" funcione en la subclase (acceda a su propia variable "activa" en lugar de la de su padre) – gibberish

+0

Edité mi publicación y agregué el código de muestra en http://gist.github.com/522619, lo espero ayuda – miku

+0

Ah, ese código al que se vinculaba era justo lo que necesitaba, ¡gracias! – gibberish

Cuestiones relacionadas