()
없이 함수를 호출 할 수 있습니까? 어쨌든 __call__()
과 같은 마법 방법을 악용하는 것일까 요?없이 함수 호출
from IPython import embed as qq
비슷한 뭔가를 할 수 있지만,이 호기심에서 더 많은, 그리고에 대한 학습 운동으로 qq()
보다는 단지 qq
를 통해 embed()
를 호출하고 싶습니다
파이썬, 실용적인 목적보다는.
()
없이 함수를 호출 할 수 있습니까? 어쨌든 __call__()
과 같은 마법 방법을 악용하는 것일까 요?없이 함수 호출
from IPython import embed as qq
비슷한 뭔가를 할 수 있지만,이 호기심에서 더 많은, 그리고에 대한 학습 운동으로 qq()
보다는 단지 qq
를 통해 embed()
를 호출하고 싶습니다
파이썬, 실용적인 목적보다는.
배우고 싶다면 파이썬으로 놀아 라.
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 (파이썬 쉘)를 사용하는 경우에 대해 자세히 알아보기, 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.
을하지만 실제로는, 당신은해야 N ot 이럴 수 있습니다!
물론이 경우에는 __repr__
을 호출 할 항목이 없으므로 REPL 외부에서 작동하지 않습니다. 분명히 전달 인수는 "지원"되지 않습니다. 그렇지
>>> class Wtf(object):
... @property
... def yadda(self):
... print "Yadda"
...
>>> w = Wtf()
>>> w.yadda
Yadda
>>>
당신이 당신의 자신의 주문을 "마법"명령을 정의하는 방법에 IPython의 문서를 확인 할 수 있습니다 : 순수 파이썬에서
는, 내가 생각할 수있는 유일한 방법은 객체와 속성을 사용하는 것입니다 : 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
이 대답은 완전히 심각하지는 않지만 흥미로운 파이썬 코드 조각을 포함하고 있습니다.
수 없습니다. '__call__'은 호출 가능한 것을 만들기 위해 사용되지만 실제로는 실제로 호출 구문을 사용해야합니다. –
글쎄, 기술적으로 당신은 repl에서'__repr__'을 악용하여 그것을 할 수 있지만, 대화식 인터프리터 밖에서는 작동하지 않을 것입니다. 또는'__getattr__'을 악용하여 클래스의 속성에 대해서만 작동합니다. – l4mpi