更改类内的类变量引用

2024-02-17

我希望能够更改 Test 类中变量的引用

class Test():
    def change(self, Other_Class):
        self.__class__ = Other_Class.__class__
        self = Other
class Other():
    def set_data(self, data):
        self.data = data
    def one(self):
        print('foo')

a = Test()
b = Other()
b.set_data([1,2,3])
a.change(b)
a.data

AttributeError: 'Other' object has no attribute 'data'

如何将对 a 的引用更改为我传递给 Test().change 的变量

我希望这也适用于内置数据类型,但我得到了一个不同的错误。

最好的方法是什么?


Inside Test.change, that self是一个参数,而参数只是局部变量。

重新绑定局部变量不会对函数之外的任何内容产生任何影响。

特别是,它对任何其他变量(或列表元素,或其他对象的属性等)没有影响,例如全局变量a,它们也绑定到相同的值。它们仍然具有相同值的名称。

甚至不清楚你是什么trying在这里做。你改变类型a进入类型b,这样就可以了。但你还想做什么?

你想改变吗a进入物体b,具有相同的身份?如果是这样,您不需要任何方法;就是这样a = b方法。或者你想成为一个不同的实例,但共享一个实例__dict__?或者复制全部b的属性变为a?浅还是深?是否有任何额外属性a躺在周围的东西也被移除了吗?你只关心存储在__dict__,或者您是否需要,例如__slots__上班?

无论如何,某件事might合理地说,对于一些奇怪的用例,是这样的:

def change(self, other):
    inherited = dict(inspect.getmembers(self.__class__))
    for name, value in inspect.getmembers(self):
        if name not in inherited and not name.startswith('__'):
            delattr(self, name)
    self.__class__ = other.__class__
    inherited = dict(inspect.getmembers(other.__class__))
    for name, value in inspect.getmembers(other):
        if name not in inherited and not name.startswith('__'):
            setattr(self, name, value)

这是否有用your用例,我不知道。但也许它可以让您了解可以使用 Python 数据模型实际执行哪些操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改类内的类变量引用 的相关文章

随机推荐