我可以在python中更改对象的__name__属性吗?

时间:2011-05-17 16:53:59

标签: python object

更改对象的__name__属性值是否正确,如下例所示:

>>>
>>> def f(): pass
...
>>> f.__name__
'f'
>>> b = f
>>> b.__name__
'f'
>>> b.__name__ = 'b'
>>> b
<function b at 0x0000000002379278>
>>> b.__name__
'b'
>>>

2 个答案:

答案 0 :(得分:3)

更改函数名称不会使新名称可调:

>>> def f(): print 'called %s'%(f.__name__)
...
>>> f()
called f
>>> f.__name__ = 'b'
>>> f()
called b
>>> b()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

您必须定义b才能调用它。正如您所看到的,只是分配b=f并未定义新功能。

答案 1 :(得分:0)

是的,您可以更改__name__。我有时会更改装饰器实例的__name__以反映其装饰的功能,例如

class CallTrace:

...

def __init__(self, f):
    self.f = f
    self.__name__ = f.__name__ + ' (CallTraced)'

我并不是说这是一个好习惯,但是过去它帮助我调试了代码。这个想法是,如果您装饰一个函数fn,然后在提示符下键入fn.__name__,则可以立即看到它已被装饰。