不用调用函数()

时间:2014-12-19 11:19:55

标签: python

我能以某种方式调用没有()的函数吗?也许以某种方式滥用__call__()等神奇方法?

我希望能够有类似的东西

from IPython import embed as qq

但仅通过embed()而不是qq

致电qq()

这更多是出于好奇,而是作为python的学习练习,而不是实际目的。

5 个答案:

答案 0 :(得分:4)

如果你正在使用REPL(Python shell),那么你可以解决这个问题,因为REPL会为你调用repr()对象(后者又会调用它们的__repr__方法):

from IPython import embed

class WrappedFunctionCall(object):
    def __init__(self, fn):
        self.fn = fn
    def __repr__(self):
        self.fn()
        return ""  # `__repr__` must return a string

qq = WrappedFunctionCall(embed)

# Typing "qq" will invoke embed now and load iPython.

但实际上,你应该这样做!

当然,它不会在REPL之外工作,因为在这种情况下没有任何东西可以调用__repr__。显然,传递参数也不受“支持”。

答案 1 :(得分:1)

仅当使用__call__调用函数时,才会调用

()。如果函数在类中,那么您可以使用@property装饰器来执行类似这样的操作

import math

class Circle(object):
    def __init__(self, radius):
        self.radius = radius

    @property
    def area(self):
        return math.pi * (self.radius ** 2)

print(Circle(5).area)
# 78.53981633974483

详细了解getter和setter here

答案 2 :(得分:0)

如果你想学习,可以玩Python。

In [1]: def foo():
   ...:     pass
   ...: 

In [2]: foo
Out[2]: <function __main__.foo>

In [3]: foo()

In [4]: bar = foo

In [5]: bar
Out[5]: <function __main__.foo>

In [6]: bar()

如您所见,foo不会调用该函数,它将返回它。这是一件好事,因为您可以将其作为参数传递并分配,例如bar = foo

答案 3 :(得分:0)

在纯Python中,我能想到的唯一方法是使用对象和属性:

>>> class Wtf(object):
...     @property
...     def yadda(self):
...         print "Yadda"
... 
>>> w = Wtf()
>>> w.yadda
Yadda
>>> 

否则,您可能需要查看IPython的文档,了解如何定义自己的自定义“魔术”命令:http://ipython.org/ipython-doc/dev/config/custommagics.html

答案 4 :(得分:0)

可以调用函数foo而不使用()(在 函数上):

def call_function(fun_name,*args):
    return fun_name(*args)

def foo(a,b):
    return a+b

print call_function(foo,1,2)

# Prints 3

请注意,这个答案并不完全严重,但它确实包含一段有趣的Python代码。