我能以某种方式调用没有()
的函数吗?也许以某种方式滥用__call__()
等神奇方法?
我希望能够有类似的东西
from IPython import embed as qq
但仅通过embed()
而不是qq
qq()
这更多是出于好奇,而是作为python的学习练习,而不是实际目的。
答案 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代码。