Ruby中的Ruby“method_missing”

时间:2011-08-05 09:21:52

标签: python metaprogramming method-missing

  

可能重复:
  Python equivalent of Ruby's 'method_missing'

Python中是否有任何可用于拦截消息(方法调用)的技术,如Ruby中的method_missing技术?

2 个答案:

答案 0 :(得分:39)

正如其他人所提到的,在Python中,当你执行o.f(x)时,它实际上是一个两步操作:首先,获取f的{​​{1}}属性,然后用参数调用它o。这是失败的第一步,因为没有属性x,而是调用Python魔术方法f的那一步。

所以你必须实现__getattr__,它返回的内容必须是可调用的。请注意,如果您还尝试获取__getattr__,则会调用相同的o.some_data_that_doesnt_exist,并且不会知道它是“数据”属性与正在搜索的“方法”。

以下是返回可调用的示例:

__getattr__

产生

class MyRubylikeThing(object):
    #...

    def __getattr__(self, name):
        def _missing(*args, **kwargs):
            print "A missing method was called."
            print "The object was %r, the method was %r. " % (self, name)
            print "It was called with %r and %r as arguments" % (args, kwargs)
        return _missing

r = MyRubylikeThing()
r.hello("there", "world", also="bye")

答案 1 :(得分:0)

您可以重载__getattr__并从中返回可调用对象。请注意,在属性查找期间,您无法决定是否要调用所请求的属性,因为Python分两步完成。