Skip to main content

Working With Python Classes

You can add DBOS decorators to your Python class instance methods. You can add step decorators to any class methods, but to add a workflow decorator to a class method, its class must inherit from DBOSConfiguredInstance and must be decorated with @DBOS.dbos_class. For example:

@DBOS.dbos_class()
class URLFetcher(DBOSConfiguredInstance):
def __init__(self, url: str):
self.url = url
super().__init__(config_name=url)

@DBOS.workflow()
def fetch_workflow(self):
return self.fetch_url()

@DBOS.step()
def fetch_url(self):
return requests.get(self.url).text

example_fetcher = URLFetcher("https://example.com")
print(example_fetcher.fetch_workflow())

When you create a new instance of a DBOS class, DBOSConfiguredInstance must be instantiated with a config_name. This config_name should be a unique identifier of the instance. Additionally, all DBOS-decorated classes must be instantiated before DBOS.launch() is called.

The reason for these requirements is to enable workflow recovery. When you create a new instance of a DBOS class, DBOS stores it in a global registry indexed by config_name. When DBOS needs to recover a workflow belonging to that class, it looks up the class instance using config_name so it can run the workflow using the right instance of its class. If config_name is not supplied, or if DBOS classes are dynamically instantiated after DBOS.launch(), then DBOS may not find the class instance it needs to recover a workflow.

Static Methods and Class Methods

You can add DBOS decorators to static methods and class methods of any class, even if it does not inherit from DBOSConfiguredInstance, because such methods do not access class instance variables. If the class contains a DBOS workflow, it must be decorated with @DBOS.dbos_class(). For example:

@DBOS.dbos_class()
class ExampleClass()
@staticmethod
@DBOS.workflow()
def staticmethod_workflow():
return

@classmethod
@DBOS.workflow()
def classmethod_workflow(cls):
return