当前位置: 首页 > 面试题库 >

函数是否有引用自身的通用方法?

厉坚
2023-03-14
问题内容

我可以通过以下代码在函数本身内部访问python函数的属性:

def aa():
    print aa.__name__
    print aa.__hash__
    # other simliar

但是,如果以上aa()函数是编写其他代码的模板,例如bb(),我必须编写:

def bb():
    print bb.__name__
    print bb.__hash__
    # other simliar

有没有类似于self类方法中参数的“指针”,所以我可以编写这样的代码?

def whatever():
    print self.__name__
    print self.__hash__
    # other simliar

我进行搜索,发现有人说可以使用该类来解决此问题,但是重新定义所有现有功能可能会很麻烦。有什么建议?


问题答案:

函数没有通用的方式引用自身。考虑改用装饰器。如果您想要的只是打印有关可以通过装饰器轻松完成的功能的信息,请执行以下操作:

from functools import wraps
def showinfo(f):
    @wraps(f)
    def wrapper(*args, **kwds):
         print(f.__name__, f.__hash__)
         return f(*args, **kwds)
    return wrapper

@showinfo
def aa():
    pass

如果确实需要引用该函数,则只需将其添加到函数参数中即可:

def withself(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        return f(f, *args, **kwds)
    return wrapper

@withself
def aa(self):
      print(self.__name__)
      # etc.

编辑以添加备用装饰器

您还可以编写一个更简单(可能更快)的装饰器,以使包装的函数在Python的自省下正常工作:

def bind(f):
    """Decorate function `f` to pass a reference to the function
    as the first argument"""
    return f.__get__(f, type(f))

@bind
def foo(self, x):
    "This is a bound function!"
    print(self, x)


>>> foo(42)
<function foo at 0x02A46030> 42
>>> help(foo)
Help on method foo in module __main__:

foo(self, x) method of builtins.function instance
    This is a bound function!

这利用了Python的描述符协议:函数具有__get__用于创建绑定方法的方法。装饰器仅使用现有方法使函数成为自身的绑定方法。它仅适用于独立功能,如果您想要一种能够引用自身的方法,则您必须做更多类似于原始解决方案的事情。



 类似资料:
  • 是否有办法在静态编程语言和Android中捆绑函数引用,以便可以从其他片段调用函数?例如,我的片段工厂方法如下所示: 我希望能够将我的tryAgainFunction保存在包中,以便进一步检索。 非常感谢! 编辑 最后,最合适的解决方案是使用热键的答案,然后在onViewCreated中使用传递的函数初始化监听器。完整代码如下: 谢谢大家的帮助!

  • 我有一个使用函数引用的类: 在典型运行期间,此函数将被称为108次。 类进入库,函数由库的用户定义。所以我不能在类中定义函数。 我读过这个: ()缺点是在被调用时引入一些(非常小的)开销(因此在性能非常关键的情况下,这可能是一个问题,但在大多数情况下不应该) 有没有更有效的方法将函数< code>u传递给类< code>equation?这算不算“性能非常关键的情况”? 编辑 似乎有点混乱。为了清

  • 我一直只使用Java6,现在正在赶上学习Java8的新内容。我在这里读了这篇文章:http://www.drdobbs.com/jvm/lambda-expressions-in-java-8/240166764?pgno=2 上面写着: Java API在Java中定义了几个通用功能接口。util。功能包。其中一个接口BiFunction描述了参数类型为T和U以及返回类型为R的函数。您可以将字符

  • 我想使用一个模板函数扩展默认的Golang模板函数,该模板函数呈现另一个Golang模板,而该模板也应该可以访问相关函数。 下面的演示案例应该创建一个< code>include模板函数,该函数呈现一个给定的模板,该模板也可以包含相同的< code>include函数。然而,这个例子(理所当然地)引发了一个初始化周期错误。 Golang 模板函数是否可以在引用自身时渲染另一个模板? https:/

  • 那么,我如何使用md5-hash与DirectoryEntry和LDAP进行身份验证呢?!有可能吗?

  • 问题内容: 如果我这样做: 在那个func里面引用foo是错误的吗? 问题答案: 很好,只有在上下文变化时才需要注意(在局部指针变量的情况下): 还请参见:https : //www.goinggo.net/2014/06/pitfalls-with-closures-in- go.html