2012-03-06 16 views
1

ここでは奇妙な質問のビット。私は自分自身の変数と関数を持つ2つの別々のオブジェクトを持っていれば、その2つのオブジェクトを1つのオブジェクトに結合することができますか?Python:2つの別々のオブジェクトを1つに融合させますか?

具体的には:15個の変数を持つオブジェクトがあり、次に自分のオブジェクトがあります。私はそれらの変数を自己にロードしたい。これを行う簡単な方法はありますか、それとも手動で行う必要がありますか?

+0

あまりにも動作しますクラス間の関係。 – prelic

+2

'object1 .__ dict __。更新(object2 .__ dict __)'? –

+2

いつも聞いてみる価値がある、なぜあなたはこれをやりたいのですか? –

答えて

4

使用__dict__プロパティ:self.__dict__.update(other.__dict__)

、これは動作しませんコーナーケースはむしろよりも、特にクラスで定義されたすべての変数に対して、ありますメソッド(または他の "実行中のコード")で実行されます。

あなたは上のほとんどすべてをコピーする場合:

for k in filter(lambda k: not k.startswith('_'), dir(other)): # avoid copying private items 
    setattr(self, k, getattr(other, k)) 
1

プロキシのように機能するオブジェクトを作成できます。オブジェクトのメソッドと変数を呼び出すだけです。 Pythonでは、あなたはそのため__getattr__()を使用することができます。

class A: 
    def __init__(self): 
     self.a1 = 1 
     self.a2 = 2 

    def a(self): 
     return "a" 

class B: 
    def __init__(self): 
     self.b1 = 1 
     self.b2 = 2 

    def b(self): 
     return "b" 

class Combine: 
    def __init__(self, *args): 
     self.__objects = args 

    def __getattr__(self, name): 
     for obj in self.__objects: 
      try: 
       return getattr(obj, name) 
      except AttributeError: 
       pass 

     raise AttributeError 

obj = Combine(A(), B()) 

print obj.a1, obj.a2, obj.a() 
print obj.b1, obj.b2, obj.b() 
0

一度に別のオブジェクトからメンバーをコピーするクイックはなく、醜い(と危険な)方法を:

self.__dict__.update(otherobj.__dict__)

ただし、メソッドと静的(クラス)メンバーはコピーされません。

2

vars(obj)戻りobj.__dict__

はそう

vars(self).update(vars(obj))は、継承のいくつかの並べ替えがありますしない限り、あなたはおそらく、オーバーコピーメンバー独自の[コピー]コンストラクタを記述する必要があります

0
for k,v in other.__dict__.items(): 
    # you might want to put other conditions here to check which attrs you want to copy and which you don't 
    if k not in self.__dict__.keys(): 
     self.__dict__[k]=v