__init__ 完成后劫持 getattr 和 setattr 函数

Hijacking the getattr and setattr functions after __init__ completes

我需要在 init 完成后拦截 setattr 和 getattr,即如果 main class 没有必需的属性,它会在 subclass extra,或者设置属性的时候,如果不在main class 则设置到subclass extra,如何理解执行了init和只有在完成后才拦截它?这是我尝试使用但没有用的代码

class Test:
    def __init__(self):
        self.default_name = "Michael"
        
    def __setattr__(self, key, value):
        if not hasattr(self, key):
            self.Extra.__dict__[key] = value;
        
        self.__dict__[key] = v
        
    def __getattr__(self, item):
        if not hasattr(self, item):
            return self.Extra.__dict__[item]
    
    class Extra:
        pass

user = Test()
user.default_name = "Tomas"
user.some_data = "test"

print(user.default_name)
print(user.some_data)

直接操作属性字典:

class Test:
    def __init__(self):
        vars(self)['default_name'] = "Michael"
        vars(self)['extra'] = Test.Extra()
        
    def __setattr__(self, key, value):
        if key not in vars(self):
            setattr(self.extra, key, value)
        else:
            vars(self)[key] = value
        
    def __getattr__(self, item):
        return getattr(self.extra, item)
    
    class Extra:
        pass

测试:

>>> user = Test()
>>> user.default_name
'Michael'
>>> user.default_name = 'Tomas'
>>> user.default_name
'Tomas'
>>> user.some_data = 'test'
>>> user.some_data
'test'
>>> vars(user)
{'default_name': 'Tomas', 'extra': <__main__.Test.Extra object at 0x000001D5151D6380>}