class User:
def __init__(self, username):
self.name = username
def _chusername(self, new_name):
old = self.name
self.name=new_name
foo = User('foo')
foo._chusername('bar')
一切正常。但我希望方法_chusername
也可以更改变量foo
本身的名称。因此foo
作为对象不再存在,但是创建了一个具有相同属性的新对象bar
:
bar.name
'bar'
因此,我需要解决我在类本身中分配给对象的变量的名称。这甚至可能吗?我的有限知识是否有一种方式不包括在内?
答案 0 :(得分:2)
不,这不是你想要做的事情。在自定义对象上更改全局名称和属性是可能(有很多工作),但这不是一个好主意。
采用以下示例:
foo = User('foo')
siteconfiguration.administrator = foo
users = [foo]
def process_users(users):
for user in users:
user._chusername('bar')
process_users(users)
这里我们有5个User('foo')
实例的引用(至少):全局名称foo
; administrator
对象上的siteconfiguration
属性; 0
中索引users
的引用; user
中for
循环中的本地名称process_users
;第五个引用是self
方法中的User._chusername()
本地名称,它是对同一个对象的引用! user
本地名称仅简要引用该对象,但在调用User._chusername()
时该引用确实存在。
现在告诉我在调用user._chusername()
时应该更改哪些名称?
我在开始时说过可以改变全球名称;您必须访问globals()
字典并查找引用与self
相同的对象的所有键,并为 Python当前导入的所有模块执行此操作。然后,如果存在对同一对象的引用,则必须在任何地方搜索所有自定义对象;否则你在上面的例子中找不到siteconfiguration.administrator
。
这是一项艰巨的任务。通过garbage collector results进行梳理可以在这里提供帮助,但是你可以在Python兔洞中走得太远,你可能应该重新考虑为什么你这样做了。
答案 1 :(得分:1)
您无法更改变量本身的名称,但可以将对象分配给新变量 像这样:
>>> foo = User('foo')
>>> foo._chusername('bar')
>>> bar = foo
>>> del foo # Deletes the original 'foo' object
>>> bar.name
bar
但我不明白你到底想做什么。必须有一个更好的方法来做到这一点 试图改变'变量名'。
解释