The method proposed by @maciej-gol is quite nice, but it does not handle the common case where the super class does not define custom __getattr__
(at least for Python3). To avoid such issue, it is better to check first using __getattribute__
, which is always defined, and to fallback to _getattr_
if it fails.
I suggest doing this if you don't know in advance if the base class implements a custom __getattr__
method:
def __getattr__(self, name):
try:
buffer = self.__getattribute__('_ubuffer')
except AttributeError:
try:
buffer = super().__getattr__('_ubuffer')
except AttributeError:
raise AttributeError('Attribute {} not found.'.format(name))
if name in buffer.dtype.names:
return buffer.data[name]
raise AttributeError('Attribute {} not found.'.format(name))
But in most cases, just using __getattribute__
should be enough:
def __getattr__(self, name):
try:
buffer = self.__getattribute__('_ubuffer')
if name in buffer.dtype.names:
return buffer.data[name]
raise AttributeError
except AttributeError:
raise AttributeError('Attribute {} not found.'.format(name))