Override __getattri__
and __getitem__
in Python
# The follow class provide dynamic access,
class BaseGBObject:
def __init__(self, payload: dict):
self._payload = payload
self._base_url = GBClientConfig.BASE_URL
self.id = self._payload['_id']
def __call__(self, payload):
self._payload = payload
self.id = self._payload['_id']
@property
def history(self):
return ""
def __getitem__(self, item)->Union[LayerGeneralType, LayerGeneralDict, LayerGeneralList]:
if isinstance(self._payload[item], dict):
return LayerGeneralDict(self._payload[item], parent=item, actions=self._actions)
if isinstance(self._payload[item], list):
return LayerGeneralList(self._payload[item], parent=item, actions=self._actions)
# return self._payload[item]
return LayerGeneralType(payload=self._payload[item], parent=item, actions=self._actions)
def __setitem__(self, key, value):
self._actions['update'](key, value)
def __getattr__(self, item)->Union[LayerGeneralType, LayerGeneralDict, LayerGeneralList]:
return self.__getitem__(item)
#
def __setattr__(self, key, value):
if not key.startswith('_') and key != 'id':
self.__setitem__(key, value)
super().__setattr__(key, value)