Python中是否有任何可用于拦截消息(方法调用)的技术,如Ruby中的method_missing技术?
答案 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分两步完成。