Python中的静态变量继承
我正在为一个项目编写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
不应该依赖于实例的类型,所以在这里可以使用这种分发方式