如何在没有 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()
如何覆盖当前脚本的魔术方法?
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()