1
$\begingroup$

I need a instance of a class that is shared among nodes (singleton). Problem is I can't call the methods of it. Here is the problem isolated:

import bpy
from ... base_types.node import AnimationNode


class Singleton:

    def __call__(self):
        return self

    def bar(self):
        print("bar")


class Foo(bpy.types.Node, AnimationNode):
    bl_idname = "an_Foo"
    bl_label = "Foo"

    singleton = None

    def create(self):
        self.singleton = Singleton()

    def execute(self):
        self.singleton.bar()

Traceback (most recent call last): File "C:\Users\clankill3r\AppData\Roaming\Blender Foundation\Blender\2.77\scripts\addons\animation_nodes\execution\main_execution_unit.py", line 38, in executeUnit exec(self.executeCodeObject, self.executionData, self.executionData) File "execution: 'NodeTree'", line 4, in File "C:\Users\clankill3r\AppData\Roaming\Blender Foundation\Blender\2.77\scripts\addons\animation_nodes\nodes\serial\foo.py", line 24, in execute self.singleton.bar() AttributeError: 'NoneType' object has no attribute 'bar'

$\endgroup$
2
$\begingroup$

You can only store some specific property types on the nodes directly. These here: https://www.blender.org/api/blender_python_api_2_77_release/bpy.props.html

If you want to access the same variable from multiple nodes you can simply create the instance outside of the node like in this example:

import bpy
from ... base_types.node import AnimationNode

class Singleton:

    def __call__(self):
        return self

    def bar(self):
        print("bar")

# store the instance in the module namespace
singleton = Singleton()

class Foo(bpy.types.Node, AnimationNode):
    bl_idname = "an_Foo"
    bl_label = "Foo"

    singleton = None

    def create(self):
        pass

    def execute(self):
        # don't use 'self' because the singleton is in the module namespace
        singleton.bar()
$\endgroup$
  • $\begingroup$ Thanks man, you're a huge help speeding up my development :) $\endgroup$ – clankill3r Apr 5 '16 at 16:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.