我可以改变Python中对象的 __name__ 属性吗?

发布于 2024-11-08 00:17:15 字数 321 浏览 0 评论 0原文

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

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

Is it correct to change the value of __name__ atribute of object like in the following example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浴红衣 2024-11-15 00:17:15

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

>>> 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 并不会定义新函数。

Changing a function's name doesn't make the new name callable:

>>> 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

You'd have to define b in order to call it. And as you saw, simply assigning b=f doesn't define a new function.

我喜欢麦丽素 2024-11-15 00:17:15

是的,您可以更改__name__。我有时会更改装饰器实例的 __name__ 以反映它正在装饰的函数,例如,

class CallTrace:

...

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

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

Yes, you can change __name__. I sometimes change the __name__ of a decorator instance to reflect the function it's decorating, e.g.

class CallTrace:

...

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

I'm not asserting this is good practice, but it has helped me debug code in the past. The idea is if you decorate a function fn, then type fn.__name__ at the prompt, you can see immediately that it's decorated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文