如果在返回值上调用方法,找到一种确定内部函数的方法?

时间:2014-05-12 11:16:11

标签: python python-3.x

我的班级看起来像这样:

class A:
    def __init__(self):
        self.bar = []

    ...

    @property
    def foo(self):
        return bar

有没有办法找出内部foo是否会在其返回值上调用方法?我希望能够根据是否

更改foo的返回值
a.foo.foobar()

a.foo

被召唤。

3 个答案:

答案 0 :(得分:2)

您可以在self.bar中使用包裹self(或仅foo() FWIW)的代理类,并重载代理的__getattr__()或{{1}方法(更棘手,可以减慢你的程序,但很好......)。

现在的问题是:你真正的问题是什么?可能有更好/更安全的解决方案......

答案 1 :(得分:2)

为了它的乐趣...

#!/usr/bin/python
import traceback

def how_was_i_called():
    call=traceback.extract_stack(limit=2)[0][3]
    print "I was called like this: %s"%call

how_was_i_called()
try:
    how_was_i_called().foobar()
except AttributeError:
  pass

返回:

I was called like this: how_was_i_called()
I was called like this: how_was_i_called().foobar()

但请不要在实际应用中使用这样的黑客......

答案 2 :(得分:1)

不,没有。 foo返回,之后返回值会发生什么,这是一个完全独立的问题。

你可以这样做,例如:

 result = a.foo
 if some_condition:
      result.foobar()

e.g。访问foobar上的a.foo方法是一个完全独立的表达式,可能会也可能不会执行。这可能发生在很多以后,或者在一个单独的线程中,或者在将对象序列化到磁盘,然后再次加载等等之后。

您可以在返回的对象上挂钩属性访问,但这对于您的foo属性改变行为来说太迟了。