Attempting to apply Descriptor to all attributes, including those of nested classes. Here is my attempt:
class Descriptor:
def __init__(self, name: str):
self.name = name
def __get__(self, instance, owner):
value = super().__get__(self, instance, owner)
print(f'Accessing {self.name} from {owner}: {value}')
return value
def __set__(self, instance, value):
print(f'Setting {self.name} to {value}')
return super().__get__(self, instance, owner)
class DescriptorMeta(type):
def __new__(cls, name: str, bases: tuple[type, ...], dct: dict[str, Any]):
for attr_name, attr_value in dct.items():
if isinstance(attr_value, type):
cls._process_group(attr_name, attr_value)
elif not attr_name.startswith('__') and not callable(attr_value):
dct[attr_name] = Descriptor(attr_name, config_file)
return super().__new__(cls, name, bases, dct)
@staticmethod
def _process_group(base_name: str, group_class: type):
for attr_name, attr_value in group_class.__dict__.items():
if not attr_name.startswith('__') and not callable(attr_value):
if isinstance(attr_value, type):
DescriptorMeta._process_group(attr_name, attr_value)
else:
setattr(group_class, attr_name, Descriptor(f"{base_name}.{attr_name}"))
class Config(metaclass=DescriptorMeta):
attr1 = 'val1'
class Cls1:
c1_attr1 = 'val2'
class Cls2:
class Cls3:
c3_attr1 = 200
c3_attr2 = 800
When accessing the attributes of nested classes from an instance of Config
, it’s not working as expected. How do I solve this?
>>> Config.Cls1.c1_attr1
calls __get__
method of Descriptor
. but,
>>> Config().Cls1.c1_attr1
doesn’t.
2