我的班级看起来像这样:
class A:
def __init__(self):
self.bar = []
...
@property
def foo(self):
return bar
有没有办法找出内部foo
是否会在其返回值上调用方法?我希望能够根据是否
foo
的返回值
a.foo.foobar()
或
a.foo
被召唤。
答案 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
属性改变行为来说太迟了。