2017-11-21 5 views
2

私は、別のにあるに、replace_object()のようなメンバ関数を使ってPythonオブジェクトを割り当てようとしました。ただし、表示されるようにobject_Aは変更されず、object_Bをコピーする唯一の方法は、完全に新しいオブジェクトobject_Cを作成することです。これは、インプレース割り当ての目的を無効にします。別のオブジェクトに(OOP)オブジェクトを割り当てる

ここでは何が起こっているのですか?割り当てをインプレースで行うにはどうしたらいいですか?

class some_class(): 

    def __init__(self, attribute): 

     self.attribute = attribute 

    def replace_object(self, new_object): 

     self = new_object 

     # Does this line even have any effect? 
     self.attribute = new_object.attribute 

     self.new_attribute = 'triangle' 

     return self 

object_A = some_class('yellow') 
print(object_A.attribute)  # yellow 
object_B = some_class('green') 
object_C = object_A.replace_object(object_B) 
print(object_A.attribute)  # yellow 
print(object_C.attribute)  # green 

#print(object_A.new_attribute) # AttributeError! 
print(object_B.new_attribute) # triangle 
print(object_C.new_attribute) # triangle 

私もcopy.copy()を使用して、深いコピーで遊んしようとしたが、無駄に。

これに興味深いねじれは私が

object_A = object_A.replace_object(object_B) 

object_C = object_A.replace_object(object_B) 

を置き換えるならば、私は私が望む結果を得ることです。しかし、self = new_objectの文がreplace_object()の中にあるのと同じ結果が得られないのはなぜですか?

PS:これはインプレース割り当てを行うのには非常に良い理由があるので、一般的にベストプラクティスではないかもしれませんが、ここで私と一緒に行ってください。

+0

これは、Pythonでの割り当ての仕組みではなく、こうした種類の言語メカニクスを変更しようとすると、専門家であってもうまくいかないでしょう。 [ここでは、割り当てがPythonで実際に行うことについての簡単なガイドです。] – user2357112

+0

*なぜ*あなたはこれを行う必要があると思いますか? –

+0

@ScottHunter ...明らかな代替手段、すなわち 'object_A = object_A.replace_object(object_B)'が冗長であるように見えるためです。 – Tfovid

答えて

1

「別のオブジェクトに割り当てる」ことはできません。新しいオブジェクトと既存のオブジェクトを新しい名前と既存の名前に割り当てることができます。

self = new_objectは、「selfnew_objectを参照します」としか言わず、古いオブジェクトには何もしません。 (self注その他のようなだけの変数名であり、唯一の慣例により、クラス定義内のオブジェクトを参照。)

self既にnew_objectの重複ラベルとなっているので、後続のコマンドself.attribute = new_object.attributeは影響を及ぼしません。

新しいオブジェクトのすべてのプロパティを古いオブジェクトにコピーできます。異なる名前と同一のプロパティを持つ2つの別個のオブジェクトになります。これらのオブジェクトに対してoverrode the equality operatorを指定しない限り、等価性テスト(a == b)はfalseを返します。

def replace_object(self, new_object): 
    self.__dict__ = new_object.__dict__.copy() # just a shallow copy of the attributes 

あなたがやりたいれるものは何でもするためのより良い方法は非常に可能性があります。すべてのプロパティをコピーするには

あなたはthisような何かを行うことができますインライン。

+0

その代わりに何がありますか?「object_A = object_A.replace_object(object_B)」は冗長でもエレガントでもないですか? – Tfovid

+0

私は以下のように答えを編集しました。 – Stuart

+0

それはできます、ありがとうございます。しかし、それはなぜ浅いコピーでなければならないのですか?単に自己ではないのですか? __dict__ = new_object .__ dict__'? – Tfovid

関連する問題