2010-08-13 3 views
10

J'écris des scripts Python pour Blender pour un projet, mais je suis assez nouveau dans le langage. Quelque chose que je suis confus à propos de l'utilisation de variables statiques. Voici le morceau de code, je travaille actuellement sur:Héritage de variable statique 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" 

L'idée est que la deuxième classe doit hériter de la variable actif et la invoquer méthode de la première, de sorte que l'appel OBJECT_OT_openConstraintPanel.invoke () change OBJECT_OT_openConstraintPanel.active. L'utilisation de self comme je l'ai fait ci-dessus ne fonctionnera cependant pas, et n'utilise pas non plus panelToggle à la place. Une idée de comment je vais à ce sujet?

+0

D'accord, il semble que je peux utiliser self.__class__.active ou le type (auto) .active laisser la méthode héritera correctement. Merci! – gibberish

+0

Pourquoi utilisez-vous des variables statiques en premier lieu? Cela ne semble pas raisonnable. Cet attribut 'active' est-il une sorte de global, partagé entre toutes les instances de' PanelToggle'? Si oui, pourquoi n'est-ce pas globalement? Ou pourquoi n'est-ce pas dans un objet partagé plus global? –

+0

Je veux que chaque sous-classe panelToggle ait sa propre variable "active" accessible sans créer d'instance. Si je comprends bien l'utilisation du mot-clé "global", je devrais d'abord insérer une ligne 'global active' dans 'invoke (..)' avant d'utiliser active comme une variable locale. Cela provoque une erreur indiquant que le nom global 'active' n'est pas défini. Je ne suis pas sûr de comprendre ce qui ne va pas avec mon approche, cependant. – gibberish

Répondre

17

utilisation type(self) pour l'accès aux attributs de classe

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

est 'type (self)' d'une façon différente de l'utilisation de 'self .__ class__'? – jorelli

+3

Ce n'est pas pour le moment. Mais certaines fonctionnalités peuvent être implémentées plus tard. Aussi, vous pouvez faire un patch de singe à la fonction de type. – Odomontois

2

Vous pouvez accéder à active par la classe elle appartient:

if panelToggle.active: 
    # do something 

Si vous souhaitez accéder à la variable de classe d'une méthode, vous pouvez écrire:

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 exemple de travail peut être trouvé ici: http://gist.github.com/522619


La variable self (nommée self par convention) est l'instance actuelle de la classe, implicitement transmise mais explicitement reçue.

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

Oui, mais je veux être en mesure de faire la même chose avec OBJECT_OT_openConstraintPanel. Je veux qu'il ait sa propre variable "active" statique, héritée de panelToggle. Je veux également faire fonctionner la méthode "invoke" dans la sous-classe (accéder à sa propre variable "active" au lieu de celle de ses parents) – gibberish

+0

J'ai édité mon post et ajouté un exemple de code dans http://gist.github.com/522619, j'espère qu'il aide. – miku

+0

Ah, ce code auquel vous étiez lié était exactement ce dont j'avais besoin, merci! – gibberish