import bpy

class VolumeNodeTree(bpy.types.NodeTree):
  bl_description = "Volumetric node trees"
  bl_icon = "MESH_TORUS"
  bl_idname = "VOLUMETRIC"
  bl_label = "Volumetric"

class VolumeNode(bpy.types.Node):
  bl_idname = 'VolumeNode'
  bl_label = "Volume Node"

  @classmethod
  def poll(cls, node_tree):
    """Can only be used with volume trees."""
    return node_tree.bl_idname == VolumeNodeTree.bl_idname

class ScalarFieldNode(VolumeNode):
  bl_idname = 'ScalarFieldNode'
  bl_label = "Scalar Field Node"

  def init(self, context):
    print("Hello, world!")

class SphereNode(ScalarFieldNode):
  bl_idname = 'SphereNode'
  bl_label = 'Sphere'
  
bpy.utils.register_class(VolumeNodeTree)
bpy.utils.register_class(SphereNode)