2014-05-12 31 views
1

我的類看起來是這樣的:如果在返回值上調用方法,找到一種確定內部函數的方法嗎?

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

    ... 

    @property 
    def foo(self): 
     return bar 

有沒有辦法找出裏面foo無論是方法上的返回值被稱爲?我想是能夠根據

a.foo.foobar() 

a.foo 

是否被稱爲改變foo返回值。

+2

你能提供一些更廣泛的信息 - 你想達到什麼目的,爲什麼你需要實現這個? – jonrsharpe

+0

你爲什麼要這麼做?這聽起來像你正在追求一個錯誤的解決方法。 – perreal

+0

如果使用'a.foo'直接返回一個對象列表,並且在使用'a.foo.foobar()'的時候返回另一個對象,可以使用該列表來執行某些操作。然而,我已經採取了返回一個類似列表的自定義類來完成我想要的任何事情,我只是好奇這個模式是否可能。 –

回答

1

不,沒有。 foo返回,之後的返回值會發生什麼,這完全是一個單獨的問題。

你能做到這一點,例如:

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

例如在a.foo上訪問foobar方法是一個完全獨立的表達式,可以執行也可以不執行。這可能在稍後的時間發生過,或在一個單獨的線程,或連載的對象到磁盤,然後再加載它之後,等

您可以掛接到屬性訪問返回的對象上,但是對於foo屬性來說,這太遲了以改變行爲。

2

你可以使用foo()代理類包裝self.bar(或只是self FWIW))和過載代理的__getattr__()__getattribute__方法(更棘手,可以減緩你的程序相當多,但好...)。

現在的問題是:你真正的問題是什麼?有可能會更好/更安全的解決方案...

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() 

,但請不要使用這樣的黑客在實際應用中。 ..

相關問題