[英]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.