Python中的静态变量继承

14 投票
2 回答
20519 浏览
提问于 2025-04-16 02:44

我正在为一个项目编写Blender的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"

我的想法是,第二个类应该继承第一个类的active变量和invoke方法,这样调用OBJECT_OT_openConstraintPanel.invoke()时,就能改变OBJECT_OT_openConstraintPanel.active的值。然而,像我上面那样使用self是行不通的,使用panelToggle也不行。你知道我该怎么做吗?

2 个回答

4

你可以通过所属的类来访问 active

if panelToggle.active:
    # do something

如果你想从一个方法里访问这个 的变量,你可以这样写:

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

这里有一个可以运行的例子:http://gist.github.com/522619


self 这个变量(按照惯例叫 self)代表当前这个类的实例,它是隐式传递的,但需要显式接收。

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
22

使用 type(self) 可以访问类的属性

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

更新

对于 classmethod 来说,这样做更简单,也更自然

class A(object):
     var  = 2
     @classmethod
     def write(cls):
       print(cls.var)

staticmethod 不应该依赖于实例的类型,所以在这里可以使用这种分发方式

撰写回答