python - 从不同的类调用一个类中的函数

标签 python scripting add-on

我正在创建一个附加组件。我坚持从不同的类调用一个类的方法。 例如……

class A(bpy.types.Operator):
    def execute(self,context):
    #Code
class B(bpy.types.Operator):
    def execute(self,context):
    #Code
    Go back to class A...

我不知道该怎么做......

最佳答案

有几种方法可以做到这一点,但它更多的是关于 Python 的问题,而不是关于 bpy API 的问题。

一种方法

大多数时候,如果我有 Operator 之间共享的功能,我会将它们从类中取出并在 Operator 中引用它们。

def some_shared_function(caller, context):
    # ...
    return 

class A(bpy.types.Operator):
    (...)
    def execute(self,context):
        some_shared_function(self, context)

class B(bpy.types.Operator):
    (...)
    def execute(self,context):
        # other code here
        some_shared_function(self, context)

另一种方法

或者根据传递的参数使操作符有不同的行为

class AB(bpy.types.Operator):
    bl_idname = "wm.simple_multi_operator"
    bl_label = "Multi Purpose Operator"

    param_one = StringProperty()
    # param_two = StringProperty()

    def execute(self,context):

        if self.param_one == 'A':
            self.some_functionality(context)

        elif self.param_one == 'B':
            # some other code
            self.some_functionality(context)

        return {'FINISHED'}

    def some_functionality(self, context):
        ...

在您的用户界面代码中,您将像这样传递参数

row = layout.row()
opname = "wm.simple_multi_operator"
row.operator(opname, text='A').param_one = 'A'
row.operator(opname, text='B').param_one = 'B'

# if you have more than one property for the operator
op_two = row.operator(opname, text='B / Mode Y')
op_two.param_one = 'B'
op_two.param_two = 'Mode Y'

直接从脚本中调用运算符是这样的

# or calling from a script
bpy.ops.wm.simple_multi_operator(param_one='A')
bpy.ops.wm.simple_multi_operator(param_one='B')

# with more than one parameter pass the keywords and values
bpy.ops.wm.simple_multi_operator(param_one='B', param_two='Mode Y')

这种方法的优缺点值得一提。

  • 缺点:如果您习惯于为运算符(operator)制作工具提示,则此方法不允许您为按钮定义唯一的工具提示。
  • 优点:您可以快速为 Operator 提供新功能,而无需声明全新的 Operator

另一种方法(使用Python的classmethod装饰器)

import bpy


class A(bpy.types.Operator):
    bl_idname = "object.simple_operator_a"
    bl_label = "Simple Object Operator A"

    def execute(self,context):
        self.some_function()
        return {'FINISHED'}

    @classmethod
    def some_function(cls, some_parameter='not woop'):
        print('some_parameter', some_parameter)

class B(bpy.types.Operator):
    bl_idname = "object.simple_operator_b"
    bl_label = "Simple Object Operator B"

    def execute(self,context):
        A.some_function('woooop')
        return {'FINISHED'}


def register():
    bpy.utils.register_module(__name__)


def unregister():
    bpy.utils.unregister_module(__name__)


if __name__ == "__main__":
    register()

然后调用它们:

>>> bpy.ops.object.simple_operator_a()
some_parameter not woop
{'FINISHED'}

>>> bpy.ops.object.simple_operator_b()
some_parameter woooop
{'FINISHED'}

不确定这是否有帮助,但为了完整性添加:

# autocomplete from the open parenthesis gives:
>>> bpy.types.OBJECT_OT_simple_operator_a.some_function(
some_function(cls, some_parameter='not woop')

# calling the function, gives:
>>> bpy.types.OBJECT_OT_simple_operator_a.some_function()
some_parameter not woop

关于python - 从不同的类调用一个类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903187/

相关文章:

python - 如何枚举列表中的值然后在函数中求和?

javascript - Dropzone.js 阻止 Flask 渲染模板

bash - 在同一文件夹终端脚本中复制多个同名文件

google-apps-script - 如何使库与调用者脚本 PropertiesService 一起工作?

firefox - 您如何打包和自托管您的 Firefox 扩展程序?

ios - 启动 iPhone 应用程序的附加组件

python - 两次python之间的区别

python - 在 pandas 中查找重复项并按日期使用非 Nan 值修改它们

linux - 在每行的开头添加前缀字符串

bash - 如何调试返回值的 Bash 函数,以及如何向变量添加换行符?