我可以以某種方式調用沒有()
的函數嗎?莫名其妙地濫用魔術方法如__call__()
?不用()調用函數
我希望能夠類似的東西
from IPython import embed as qq
,但僅通過qq
調用embed()
,而不是qq()
這更多的是出於好奇,作爲一個學習鍛鍊蟒蛇,而不是實際的目的。
我可以以某種方式調用沒有()
的函數嗎?莫名其妙地濫用魔術方法如__call__()
?不用()調用函數
我希望能夠類似的東西
from IPython import embed as qq
,但僅通過qq
調用embed()
,而不是qq()
這更多的是出於好奇,作爲一個學習鍛鍊蟒蛇,而不是實際的目的。
如果您想學習,請使用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
。
只有在調用()
函數時纔會調用__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
如果您使用的是REPL(Python的外殼),那麼你就可以破解解決這個自己的方式,因爲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.
不過說真的,你應該ñ ot正在做這個!
當然,它不會在REPL之外工作,因爲在這種情況下不會有任何事情要撥打__repr__
。顯然,傳遞論據也不是「支持」的。
在純Python,我能想到的唯一方法是使用對象和屬性:
>>> class Wtf(object):
... @property
... def yadda(self):
... print "Yadda"
...
>>> w = Wtf()
>>> w.yadda
Yadda
>>>
否則,你可能要檢查IPython的關於如何定義你自己的「神奇」的命令DOC :http://ipython.org/ipython-doc/dev/config/custommagics.html
您可以調用函數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代碼片段。
你不能。 '__call__'被用來調用一些可調用的函數,但你仍然需要實際使用調用語法來實現。 – 2014-12-19 11:25:49
好吧,從技術上講,你可以通過濫用'__repr__'來實現它,但這當然不能在交互式解釋器之外工作。或者濫用'__getattr__',這當然只適用於某個類的屬性。 – l4mpi 2014-12-19 11:28:15