如何在没有 class 的情况下覆盖当前脚本的魔术方法?

How to override a magic method for the current script without a class?

如何覆盖当前脚本的魔术方法?

def __setattr__(name, value):
    __dict__[name] = value
    print("asd")
    if name == 'b':
        print(__dict__[name])


if __name__ == '__main__':
    a = 3
    b = 4
    b = 5

例如,在上面,我希望对 b 的赋值会调用 __setattr__ 但它们不会。我错过了什么?

__setattr__ 适用于 a.b = c 形式的赋值,转换为 type(a).__setattr__(b, c)。简单的名称分配是语言本身的基本操作,不是通过任何魔术方法实现的。

您只是在定义一个名为 __setattr__ 的模块级函数,而不是任何特定 class.

的魔术方法

编辑:我意识到我犯了一个错误。您的问题是如何在不使用 class 的情况下覆盖方法。这在 python 中是不可能的,因为方法只能在派生自 class.

的对象上调用

对于初学者,您可能需要考虑定义一个 class。方法是在对象上调用的(魔法方法,普通方法,都一样),而对象又是从它们的 classes 派生的。请注意,在 python 中,一切都是对象。标准 python 库中有几个 classes,例如 String、Integer、Boolean 等等。您的代码必须看起来更像以下内容:

def class Some_Class:
    name = ""
    __init__(self,name):
        self.name = name

    __setattr__(self,name,value):
        if name == "b":
            self.doSomething()

    def doSomething():
        pass

def main():

    example_class = Some_Class('Chars')
    setattr(example_class, 'b','some_value') #Will trigger doSomething()

main()