【问题标题】:How to override a magic method for the current script without a class?如何在没有类的情况下覆盖当前脚本的魔法方法?
【发布时间】:2018-02-10 15:04:43
【问题描述】:

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

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__,但他们没有。我错过了什么?

【问题讨论】:

  • 有人可以指导我这个问题究竟是如何不清楚的吗?这样我可以更好地澄清它。

标签: python overriding magic-methods


【解决方案1】:

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

您只是定义了一个名为 __setattr__ 的模块级函数,而不是任何特定类的魔术方法。

【讨论】:

  • 感谢您的意见,我不认为我完全理解它,但至少可以引导我进行更多研究。
  • 是否有任何解决方法可以捕获当前脚本的名称分配以在特定名称发生时调用方法?
  • 没有。正如我所说,名称分配是一个基本的操作;它不是根据您可以覆盖的较低级别的操作来实现的。赋值只是
【解决方案2】:

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

对于初学者,您可能需要考虑定义一个类。方法在对象上调用(魔术方法,普通方法,都一样),而对象又是从它们的类派生的。请注意,在 python 中,一切都是对象。标准 Python 库中有几个类,例如 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多