2014-12-19 30 views
-3

我可以以某種方式調用沒有()的函數嗎?莫名其妙地濫用魔術方法如__call__()不用()調用函數

我希望能夠類似的東西

from IPython import embed as qq

,但僅通過qq調用embed(),而不是qq()

這更多的是出於好奇,作爲一個學習鍛鍊蟒蛇,而不是實際的目的。

+0

你不能。 '__call__'被用來調用一些可調用的函數,但你仍然需要實際使用調用語法來實現。 – 2014-12-19 11:25:49

+0

好吧,從技術上講,你可以通過濫用'__repr__'來實現它,但這當然不能在交互式解釋器之外工作。或者濫用'__getattr__',這當然只適用於某個類的屬性。 – l4mpi 2014-12-19 11:28:15

回答

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

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

4

如果您使用的是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__。顯然,傳遞論據也不是「支持」的。

0

在純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

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代碼片段。