2016-11-21 5 views
0

は、ここで私は2 classes ABPythonで簡単に変数のプロパティを別の変数に移す方法はありますか?

class A(object): 
    def __init__(self): 
    self.a1=0 
    self.a2=0 
    self.a3=0 
class B(object): 
    def GenerateA(self): 
    self.a=A() 
    #some codes go here 
    return self.a 
a=A() 
a.a1=1 
a.a2=2 
a.a3=3 
b=B() 
ainb=b.GenerateA() 
print(ainb) 
ainb.a1=a.a1 
ainb.a2=a.a2 
ainb.a3=a.a3 
print(ainb) 

class B

class Aの空のインスタンスを返すことができ GenerateA()の機能を有している(しかし、彼らは、ベンダーからなので、私はそれが正確に何をしたか分からないが)持っています。 class Aはインターフェイスクラスで、 Bにさらに計算のための値を知らせる。ここで私はすべてのプロパティの ainbを設定する必要があります。私は変わらず、そのアドレスを保つことができるように、私は copy.deepcopy()を想定、簡単な方法でセットアップ ainbに願っています

a=A() 
a.a1=1 
a.a2=2 
a.a3=3 
ainb.a1=a.a1 
ainb.a2=a.a2 
ainb.a3=a.a3 

を行うことによって

ainb.a1=1 
ainb.a2=2 
ainb.a3=3 

またはIをセットアップできます:私は直接、このように行うことができますメソッドは完全に私がしたくないアドレスを置き換えます。 ご意見はありますか? ありがとうございます!

+0

'deepcopy()メソッドは完全にアドレスを置き換えます'どのアドレスですか? – njzk2

+0

あなたはクラスAとクラスBの構造を変更できますか? –

+0

申し訳ありません、私は完全に間違っているかもしれませんが、deepcopy()は元のものから深く新しいインスタンスを作成するので、クラスAの新しいインスタンスの完全に異なるアドレスを生成します。 –

答えて

1

すべての属性の値をaからainbにコピー/転送するには、次のように入力します。おそらくaの方法および二重下線の全てを除外すべきである

attrs = [attr for attr in dir(a) if not attr.startswith('__') and not callable(attr)] 

は次に残りの属性を反復とgetattrsetattr使用属性:

for attr in attrs: 
    try: 
     setattr(ainb, attr, getattr(a, attr)) 
    except AttributeError: 
     print 'ainb does not have', attr 

同様に、属性と値のペアを持つコンテナがある場合:

setup = [('a1', 1), ('a2', 2), ('a3', 3)] 
for attr, value in setup: 
    try: 
     setattr(ainb, attr, value) 
    except AttributeError: 
     print 'ainb does not have', attr 
+0

詳細な説明をいただきありがとうございます。 –

関連する問題