我有一个程序,最重要的是覆盖内存中的对象而不是更改它,或重定向对它的引用。
基本上,如果我正在编写C ++,我会有多个指针都指向内存中的相同地址。我想覆盖该地址的内容。
我希望能够在对象本身内执行此操作。
即
class MyClass
def __init__(self):
pass
def overwrite(self,otherObjectOfTypeMyClass):
#after this operation, all references to self now point to otherObjectOfTypeMyClass
答案 0 :(得分:3)
与C ++不同,内存管理不受Python控制。总的来说,这是一件好事。不必担心记忆是我们这些从C开始的人的一大好处。
在python中我们所谓的变量实际上是指向对象的标签。因此,如果您想更改一个非永久性的对象(如列表),那么它应该在Python中开箱即用。
但是,你通常不能在Python中覆盖对象。创建新对象将使用空闲内存。正在使用的内存只有在没有引用时才会被垃圾收集。
答案 1 :(得分:1)
好的,我找到了一个似乎适合我特定用途的解决方案。我不知道python的内部是否足以说明这是否会以意想不到的方式打破。我有兴趣听到为什么或为什么不这样做是危险的。我也有兴趣,如果有人有任何想法,其中这不会做我期望它。如果有人认为这实际上是灾难性的话,我会等待这几天的正确标记。
def replaceobject(obj1,obj2):
#Replaces obj1 with obj2
obj1.__dict__ = obj2.__dict__
class MyClass:
def __init__(self):
self.attr0 = None
self.attr1 = None
self.attr2 = None
self.attr3 = None
def set_some_attrs(self):
self.attr0 = 0
self.attr1 = "1"
self.attr2 = {"2":2}
self.attr3 = [3]
#Set up scenario, three objects of the same type, one points to a different address
A = MyClass()
A.set_some_attrs()
C = A
B = MyClass()
#Make replacement and spit contents
replaceobject(B,A)
print B.attr0 #=> 0
print B.attr1 #=> "1"
print B.attr2 #=> {"2":2}
print B.attr3 #=> [3]
#Modify the replaced object and changes are reflected
B.attr2 = "made a change"
print A.attr2 #=> "made a change"
print C.attr2 #=> "made a change"
答案 2 :(得分:0)
Python支持多重继承,那么如何让myClass
成为A
和B
的包装器呢?可能看起来有点矫枉过正,如果A
和B
使用类似的界面,您可能会介绍diamond problem,但这是接近"覆盖"我能想到的。