2011-06-22 13 views
0

いくつかのインスタンス変数を持つクラス( "A"という名前)があります。インスタンスのdir()への追加

class A(object): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
class X(object): 
    def f_x(self): 
     pass 
class Y(object): 
    def f_y(self): 
     pass 

x = X(); y = Y() 
a = A(x,y) 

は私が

dir(a) 
に表示されるようにF_Xとf_yをしたい:私は、たとえばクラスA

のインスタンスのディレクトリ()にこの変数のディレクトリを()を追加したいです

は、より良い方法はあります、または1つ以上「正しい」、ちょうどX. 辞書とY. dictのを反復より、各要素について、のようなものを使用します。

setattr(A, str(element), element) 

ありがとうございました。

+3

あなたは何をしたいですか?あなたが書いたことはあまり意味がありません –

+0

@フランクリン:まず、ありがとう。私の実際の例を単純化するために、クラスXとYはどちらも私に「与えられた」もので、両方ともカプセル化したいいくつかの機能を実装しています。 したがって、私の実際の例では継承が正しいとは確信していません。 私は、私のクラス(クラスA)のユーザーが、インスタンス変数としてxとyを保持していることを知らずに、XとYの両方からすべての関数を見ることができるようにしたいだけです。 – Stav

+0

クラスのユーザーは実際にインスタンス変数を知らなくてもそれらの関数を実際に呼び出すことができますか?もしそうなら、どうですか?もしそうでなければ、あなたは**本当に** **どうやって**可能なのかを尋ねていますか? –

答えて

2

なぜあなたは両方のクラスから継承しないのですか?

class B(A, X): 
    pass 

a = B() 
dir(a) 
2

Aは本当にこの場合にはXYのサブクラスでなければなりません。 (ちょうどあなたがあまりにも深く、それに入る前に、Michele Simionato's article on super and diamond inheritenceを必ずお読みください。)

class X(object): 
    def f_x(self): 
     pass 

class Y(object): 
    def f_y(self): 
     pass 

class A(X, Y): 
    def __init__(self, *args, **kwargs): # splats optional 
     # do what you need to here 

dir(A(X(),Y())) # Ah! Lisp! 

ただし、本当にはその後、ちょうど投げる前self.xself.yに見てXため__getattr__をオーバーライドし、魔法のように物事が必要な場合エラー。しかし真剣に、これをしないでください。

+1

+1のために「do not do this」 – Daenyth

+0

Aの.xと.yメンバーはあなたのために何をしていますか? –

+0

@Russell - サブクラス「A」が何か重要なことをする必要があるクラス「X」のインスタンスとクラス「Y」のインスタンスにアクセスできます。 (私は、 'A' *が' X'または 'Y'として行動していると仮定しています**もしそれが自分自身の' self.x'と 'self.y'インスタンスに**作用する必要があれば'A'で' f_x'と 'f_y'をオーバーライドする必要があります。もし' X'と 'Y'でなければ' x'と 'y'のインスタンスは必要ないでしょう')。 –

関連する問題