ckdanny
3/1/2020 - 3:51 AM

Override `__getattri__` and `__getitem__` in Python

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)