私は、別のにあるに、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:これはインプレース割り当てを行うのには非常に良い理由があるので、一般的にベストプラクティスではないかもしれませんが、ここで私と一緒に行ってください。
これは、Pythonでの割り当ての仕組みではなく、こうした種類の言語メカニクスを変更しようとすると、専門家であってもうまくいかないでしょう。 [ここでは、割り当てがPythonで実際に行うことについての簡単なガイドです。] – user2357112
*なぜ*あなたはこれを行う必要があると思いますか? –
@ScottHunter ...明らかな代替手段、すなわち 'object_A = object_A.replace_object(object_B)'が冗長であるように見えるためです。 – Tfovid