在类本身中重命名类对象名称

时间:2014-04-18 11:28:09

标签: python python-3.x

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'

因此,我需要解决我在类本身中分配给对象的变量的名称。这甚至可能吗?我的有限知识是否有一种方式不包括在内?

2 个答案:

答案 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的引用; userfor循环中的本地名称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

但我不明白你到底想做什么。必须有一个更好的方法来做到这一点 试图改变'变量名'。

解释