如何在python中覆盖对象?

时间:2016-03-27 03:23:02

标签: python

我有一个程序,最重要的是覆盖内存中的对象而不是更改它,或重定向对它的引用。

基本上,如果我正在编写C ++,我会有多个指针都指向内存中的相同地址。我想覆盖该地址的内容。

我希望能够在对象本身内执行此操作。

class MyClass
    def __init__(self):
        pass

    def overwrite(self,otherObjectOfTypeMyClass):
       #after this operation, all references to self now point to otherObjectOfTypeMyClass

3 个答案:

答案 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成为AB的包装器呢?可能看起来有点矫枉过正,如果AB使用类似的界面,您可能会介绍diamond problem,但这是接近"覆盖"我能想到的。