Python相当于Ruby的'method_missing'

mis*_*tor 24 ruby python oop metaprogramming method-missing

什么是Python相当于Ruby的method_missing方法?我尝试过使用__getattr__但是这个钩子也适用于字段.我只想拦截方法调用.Python的方法是什么?

Emi*_*nov 27

Python在属性和方法之间没有区别.方法只是一个属性,其类型只是instancemethod,恰好是可调用的(支持__call__).

如果你想实现这个,你的__getattr__方法应该返回一个函数(一个lambda或一个常规的def,你需要的任何套件),并可能在调用后检查一些东西.

  • 作为参考,有问题的链接通过定义应该被视为方法的属性名称列表来解决模糊性(这听起来有点类似于失败的目的,因为您可以_define_这些方法中的每一个并委托给存根). (2认同)

sen*_*rle 5

Python 不像 Ruby 那样区分方法和属性(也就是“实例变量”)。在 Python 中以完全相同的方式查找方法和其他对象属性——甚至 Python 都不知道在查找阶段的区别。在找到该属性之前,它只是一个字符串。

所以,如果你问的方式,以确保__getattr__唯一呼吁方法,我怕你可能不会找到一个完美的解决方案。但它是很容易简单地返回一个函数(或甚至一个全新的动态绑定的方法从)__getattr__

  • Ruby 根本不区分方法和属性——Ruby 中没有属性这样的东西。 (2认同)