繁体   English   中英

在类中更改类变量引用

[英]Change class variable reference within the class

我希望能够在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()的变量

我也希望此方法也适用于内置数据类型,但是为此我得到了另一个错误。

最好的方法是什么?

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

并且重新绑定局部变量对函数以外的任何内容都没有任何影响。

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

甚至不清楚您要这里做什么。 您将a的类型更改为b的类型,并且可以使用。 但是您还想做什么?

你想改变a到对象b ,具有相同的身份? 如果是这样,则不需要任何方法。 那就是a = b意思。 还是您想成为一个独特的实例,但要共享一个实例__dict__ 还是将b的所有属性复制到a 浅还是深? 如果有任何额外的属性a已经躺在附近被同时删除? 您是否只关心__dict__存储的属性,还是需要__slots__才能工作?

无论如何,对于某些奇怪的用例, 可能是合理的事情是:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM