ここでは奇妙な質問のビット。私は自分自身の変数と関数を持つ2つの別々のオブジェクトを持っていれば、その2つのオブジェクトを1つのオブジェクトに結合することができますか?Python:2つの別々のオブジェクトを1つに融合させますか?
具体的には:15個の変数を持つオブジェクトがあり、次に自分のオブジェクトがあります。私はそれらの変数を自己にロードしたい。これを行う簡単な方法はありますか、それとも手動で行う必要がありますか?
ここでは奇妙な質問のビット。私は自分自身の変数と関数を持つ2つの別々のオブジェクトを持っていれば、その2つのオブジェクトを1つのオブジェクトに結合することができますか?Python:2つの別々のオブジェクトを1つに融合させますか?
具体的には:15個の変数を持つオブジェクトがあり、次に自分のオブジェクトがあります。私はそれらの変数を自己にロードしたい。これを行う簡単な方法はありますか、それとも手動で行う必要がありますか?
使用__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))
プロキシのように機能するオブジェクトを作成できます。オブジェクトのメソッドと変数を呼び出すだけです。 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()
一度に別のオブジェクトからメンバーをコピーするクイックはなく、醜い(と危険な)方法を:
self.__dict__.update(otherobj.__dict__)
ただし、メソッドと静的(クラス)メンバーはコピーされません。
vars(obj)
戻りobj.__dict__
はそう
vars(self).update(vars(obj))
は、継承のいくつかの並べ替えがありますしない限り、あなたはおそらく、オーバーコピーメンバー独自の[コピー]コンストラクタを記述する必要があります
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
あまりにも動作しますクラス間の関係。 – prelic
'object1 .__ dict __。更新(object2 .__ dict __)'? –
いつも聞いてみる価値がある、なぜあなたはこれをやりたいのですか? –