Frage

Ich schreibe Python-Skripte für Blender für ein Projekt, aber ich bin ziemlich neu in die Sprache. Etwas, was ich bin verwirrt über die Verwendung von statischen Variablen. Hier ist das Stück Code Zur Zeit arbeite ich an:

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"

Die Idee ist, dass die zweite Klasse sollte die aktiv Variable und die invoke Methode von der ersten erben, so dass OBJECT_OT_openConstraintPanel.invoke () aufrufen, ändert OBJECT_OT_openConstraintPanel.active. Mit self , wie ich oben tat wird jedoch nicht funktionieren, und auch nicht mit panelToggle statt. Jede Idee, wie ich mich über das?

War es hilfreich?

Lösung

Verwendung type(self) für den Zugriff auf Klassenattribute

>>> 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

Andere Tipps

Sie können active durch die Klasse zugreifen es gehört zu:

if panelToggle.active:
    # do something

Wenn Sie für den Zugriff auf die Klasse Variable von einer Methode, könnten Sie schreiben:

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.'

Ein Arbeitsbeispiel finden Sie hier: http://gist.github.com/522619


Die self Variable (namens self vereinbarungs) ist die aktuelle Instanz der Klasse, implizit vergangen, aber explizit empfangen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top