It would be nice to have the fields initialized here in the base class constructor if possible. In general this reduces the risk of ending up with the object in a partially constructed (and unusable) state. You could either validate the input before you call the init...

    class DXDataObject(DXObject):
        def __init__(self, dxid=None, project=None):
            DXObject.__init__(self, dxid=verify_dxid(dxid, desired_class=self._class), project=project)

Alternatively, have the base class init method validate the input...

    class DXDataObject(DXObject):
        def __init__(self, dxid=None, project=None):
            DXObject.__init__(self, dxid=dxid, project=project, desired_class=self._class)

What do you think?