python中函数是对象_如何在函数中获取函数对象(Python)

Python中的函数是对象,碰巧这些对象有一个属性,其中包含定义它们的名称:>>> def x():

... pass

...

>>> print x.__name__

x

所以,一个天真的方法可能是:

^{pr2}$

这似乎很管用。但是,由于您必须知道函数中x的名称,所以您并没有真正获得任何东西;您可能只需要这样做:def x():

print "x"

但事实上,这比这更糟糕,因为__name__属性只引用函数在定义时使用的名称。如果它绑定到另一个名称,它的行为将不符合您的预期:>>> y = x

>>> y()

x

更糟糕的是,如果原来的名字已经不在了,它就根本不起作用了:>>> del x

>>> y()

Traceback (most recent call last):

File "", line 1, in

File "", line 2, in x

NameError: global name 'x' is not defined

第二个问题是一个你实际上可以解决的问题,尽管它并不漂亮。诀窍是编写一个decorator,它可以将函数的名称作为参数传递给它:>>> from functools import wraps

>>> def introspective(func):

... __name__ = func.__name__

... @wraps(func)

... def wrapper(*args, **kwargs):

... return func(__name__=__name__, *args, **kwargs)

... return wrapper

...

>>> @introspective

... def x(__name__):

... print __name__

...

>>> x()

x

>>> y = x

>>> y()

x

>>> del x

>>> y()

x

。。。尽管如您所见,您仍然只能返回函数定义时使用的名称,而不是它现在恰好绑定到的名称。在

在实践中,简短(正确的)答案是“不要这样做”。Python的一个基本事实是对象不知道它们绑定到了什么名称—如果您认为您的函数需要这些信息,那么您就做错了事情。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值