0

この例を考えてみましょう: 2 つの兄弟クラスがあり、一方が他のクラスを新しい属性としてロードし、兄弟内のメイン クラスからこの属性を使用したいと考えています。

a = 2
class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(a)


class BE(object):
   def __init__(self,a):
       print a

   def get_aplus(self):
       ????

c = AN(a)

そして私はやりたい:

c.BECls.get_aplus() 

これは、self.self.aplus (比喩的に) のようなものを返します。これは 4 になります。

再開: 引数として宣言せずに、BE クラス内の AN から aplus 属性を取得しますが、「a」変数が既に AN を介してロードされている必要があることを考慮して、可能であれば「リバース イントロスペクション」を実行します。

わかりにくかったら申し訳ありませんが、実際のコードで何が起こっているのかを単純化しようとしました。

問題は、クラスで使用しているテクニックにあると思います。しかし、何をどのように改善するのかはわかりません。

ありがとう

4

1 に答える 1

2

OPの質問:

引数として宣言せずに、BE クラス内の AN から aplus 属性を取得しますが、「a」変数が既に AN を介してロードされている必要があることを考慮して、可能であれば「リバース イントロスペクション」を実行します。

「リバース イントロスペクション」に最も近いのは、gc.getreferrers()による検索です。

とはいえ、単純に関係を明示した方がよいでしょう

class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(self, a)

class BE(object):
   def __init__(self, an_obj, a):
       self.an_obj = an_obj
       print a

   def get_aplus(self):
       return self.an_obj.aplus

if __name__ == '__main__':
    a = 2
    c = AN(a)
    print c.BECls.get_aplus()     # this returns 4
于 2012-04-27T04:59:11.503 に答える