2012-03-20 10 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

あなたがミックスインを探しているなら、それはあなたがpythonでやる方法ではありません。 – georg

+0

質問は、明示的に参照を渡すことなくオブジェクト間のシグナリングについてです。継承されていない機能やミックスイン。 –

+0

このスレッドは興味深いかもしれません:http://stackoverflow.com/questions/115844/recommended-python-publish-subscribe-dispatch-module – georg

答えて

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つの異なるインスタンスに接続し、インスタンスが彼に話をしたいたびに、「知っている」されます。

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._getframe5 Years of Bad Ideasに記載されている理由があります。

代わりに、参照を親オブジェクトまたはsay_hiメソッドに渡します。

関連する問題