清除方法以在初始化之后禁用`__setattr__`

Pau*_*nta 15 python setattr python-3.x

我写了以下包装类.我想定义__setattr__它将所有属性重定向到包装类.但是,这阻止我初始化包装类.有什么优雅的方法可以解决这个

class Wrapper:
    def __init__(self, value):
        # How to use the default '__setattr__' inside '__init__'?
        self.value = value

    def __setattr__(self, name, value):
        setattr(self.value, name, value)
Run Code Online (Sandbox Code Playgroud)

qua*_*tum 16

您正在捕获所有分配,这会阻止构造函数分配self.value.您可以使用它self.__dict__来访问实例字典.尝试:

class Wrapper:
    def __init__(self, value):
        self.__dict__['value'] = value

    def __setattr__(self, name, value):
        setattr(self.value, name, value)
Run Code Online (Sandbox Code Playgroud)

另一种使用方式object.__setattr__:

class Wrapper(object):
    def __init__(self, value):
        object.__setattr__(self, 'value', value)

    def __setattr__(self, name, value):
        setattr(self.value, name, value)
Run Code Online (Sandbox Code Playgroud)


fra*_*gos 8

禁用的一种方式__setattr__,直到初始化后,在不改变self.value = value在语法__init__方法覆盖这里.简而言之,在对象中嵌入初始化知识并在__setattr__方法中使用它.对于你Wrapper:

class Wrapper:
    __initialized = False
    def __init__(self, value):
        self.value = value
        self.__initialized = True

    def __setattr__(self, name, value):
        if self.__initialized:
            # your __setattr__ implementation here
        else:
            object.__setattr__(self, name, value)
Run Code Online (Sandbox Code Playgroud)