__getattr__和__setattr__在这段代码中的作用是什么?

what is the role of __getattr__ and __setattr__ in this piece of code?

我用这种方式在 python 中编写了单例模式。它工作正常,但我不明白 getattrsetattr到底是做什么的? getattr() 和 getattr 之间以及 python 中的 setattr() 和 setattr 之间有什么区别?这两种方法(getattrsetattr)对内部 class 做了什么以及这两种方法如何区分在内部 class 而不是外部 class ? 提前谢谢你。


class Writer:
    class __file_writer:
        def __init__(self):
            self.variable = None

        def __str__(self):
            return str(id(self))

    instance = None

    def __new__(cls, *args, **kwargs):
        if not Writer.instance :
            Writer.instance = Writer.__file_writer()

        return Writer.instance

    def __getattr__(self, item):
        return getattr(self.instance,item)

    def __setattr__(self, key, value):
        return setattr(self.instance, key,value)



if __name__ == '__main__':
    obj1=Writer()
    obj1.name = 'moli'
    print(obj1.name)
    print(type(obj1))

    obj2 = Writer()
    obj2.name = 'ffff'
    print(obj2.name)
    print(obj1.name)
    print(obj1)
    print(obj2)

__getattr__ 在您要查找此 class.

中不存在的属性时起作用

__setattr__ 当您为 class 中不存在的属性赋值时 检查这两个例子

https://python-reference.readthedocs.io/en/latest/docs/dunderattr/setattr.html#example

https://python-reference.readthedocs.io/en/latest/docs/dunderattr/getattr.html#example

它在这里没有任何作用。因为当您访问 name 时,您访问的是 class __file_writername 属性,而不是 class Writer.

的属性

如果您将 __getattr__ 函数推送到 __file_writer class 那么当您尝试访问属性 name.