2012-03-20 69 views
3

是否沒有神奇的python方法來訪問該類的實例,該實例具有對其內部當前自我的引用? 即:Python對象層次結構;引用所有者實例?

class A(object): 
    def __init__(self): 
     self.B = B() 

    def say_hi(self): 
     print "Hi" 

class B(object) 
    def __init__(self): 
     __get_owner_ref__.say_hi() 

A() 

get_owner_ref作爲靈丹妙藥並不存在。 在這種行爲的python有沒有一個功能?

是的我知道我可以傳遞給構造函數的引用,但我正在尋找一個更優雅的解決方案。

+0

如果你正在尋找mixin,那並不是你如何在python中完成的。 – georg 2012-03-20 12:39:55

+0

問題是關於在沒有顯式傳遞引用的對象之間發送信號。沒有繼承的功能或mixin。 – 2012-03-20 14:28:28

+0

此主題可能會有趣然後:http://stackoverflow.com/questions/115844/recommended-python-publish-subscribe-dispatch-module – georg 2012-03-20 15:08:32

回答

1

第二個想法,你正在尋找什麼非常類似於descriptors。試想一下:

class Agent(object): 
    def __get__(self, obj, objtype): 
     print 'Agent %s called from %s ' % (id(self), obj.name) 

class X(object): 
    agent = Agent() 

    def __init__(self, name): 
     self.name = name 

a = X('Foo') 
a.agent 

b = X('Bar') 
b.agent 

這裏agent連接到兩個不同的實例和「知道」每次哪個實例想和他談談。

2

不,沒有這樣做的好方法。將參考傳遞給初始值設定項。

爲排除問題,在大多數情況下可能可以通過檢查堆棧來啓發式檢測,例如this question。但它會變得脆弱,越野車並且難以理解。 它違背了「顯性」隱含的「哲學。

3

沒有,你不得不做這樣的事情

class A(object): 
    def __init__(self): 
     self.B = B(parent=self) 

    def say_hi(self): 
     print "Hi" 

class B(object) 
    def __init__(self, parent): 
     self.parent = parent # you don't need to do this, but it might be a good idea 
     parent.say_hi() 

A() 
2

據我所知,這樣的功能並不存在。另外,傳遞它作爲構造函數的參考並調用self.parent.say_hi()更加明確和(確實)優雅。顯式比隱式或使用神奇語言功能更好。

2

從技術上講,你可以使用sys._getframe

class B(object): 
    def __init__(self): 
     import sys 
     a = sys._getframe(1).f_locals['self'] 
     a.say_hi() 

但你不應該這樣做。它肯定會導致混淆,會破壞新的Python實現,會使調試複雜化,並且容易中斷。
sys._getframe列於5 Years of Bad Ideas的原因是有原因的。

而是將引用傳遞給父對象或傳遞給say_hi方法。

相關問題