'콜 가능'이란?
메타클래스가 무엇인지 확실히 알 수 있게 되었기 때문에 저는 메타클래스의 진정한 의미를 모른 채 항상 사용하는 관련 개념이 있습니다.
누구나 한번 괄호를 틀리면 "객체는 호출할 수 없습니다" 예외가 발생한다고 생각합니다. 가가 what what what what what what what __init__ ★★★★★★★★★★★★★★★★★」__new__ 피비린내 나는 것이 __call__사용할 수 있습니다.
마술의 예를 포함하여 몇 가지 설명을 해 주실 수 있겠습니까?
호출 가능은 호출 가능한 모든 것입니다.
삽입 콜 가능(PyCallable_Check in objects.c)은 인수가 다음 중 하나인지 확인합니다.
- 예: 는있 with of of of an 。
__call__or or method - null tp_call(c structure) 멤버가 아닌 타입으로, 콜 가능성을 나타냅니다(함수, 메서드 등).
「 」라고 하는 이름의 .__call__(설명서에 따라)
인스턴스가 함수로 "호출"되면 호출됩니다.
예
class Foo:
def __call__(self):
print 'called'
foo_instance = Foo()
foo_instance() #this is calling the __call__ method
/* Test whether an object can be called */
int
PyCallable_Check(PyObject *x)
{
if (x == NULL)
return 0;
if (PyInstance_Check(x)) {
PyObject *call = PyObject_GetAttrString(x, "__call__");
if (call == NULL) {
PyErr_Clear();
return 0;
}
/* Could test recursively but don't, for fear of endless
recursion if some joker sets self.__call__ = self */
Py_DECREF(call);
return 1;
}
else {
return x->ob_type->tp_call != NULL;
}
}
다음과 같이 되어 있습니다.
- 오브젝트가 어떤 클래스의 인스턴스인 경우, 그 오브젝트가 다음과 같은 경우 호출할 수 있습니다.
__call__여하하다 - 않으면 "" " " " " " "
x호출 가능한 iffx->ob_type->tp_call != NULL
필드 설명:
ternaryfunc tp_call오브젝트 호출을 구현하는 함수에 대한 선택적 포인터입니다.개체를 호출할 수 없는 경우 이 값은 NULL이어야 합니다.PyObject_Call()으로 지정합니다.이 필드는 하위 유형으로 상속됩니다.
든지 빌트인 할 수 .callable가 콜 콜 여부를 판별하는 것이 .그냥 콜을 캐치하는 .TypeErrorcallable 3.되므로 Python 3.0 " 3.1" 을 사용합니다.callable = lambda o: hasattr(o, '__call__') ★★★★★★★★★★★★★★★★★」isinstance(o, collections.Callable).
예를 들어 캐시의 심플한 실장은 다음과 같습니다.
class Cached:
def __init__(self, function):
self.function = function
self.cache = {}
def __call__(self, *args):
try: return self.cache[args]
except KeyError:
ret = self.cache[args] = self.function(*args)
return ret
사용방법:
@Cached
def ack(x, y):
return ack(x-1, ack(x, y-1)) if x*y else (x + y + 1)
표준 라이브러리, 파일, 빌트인의 정의 예exit() ★★★★★★★★★★★★★★★★★」quit()★★★★
class Quitter(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return 'Use %s() or %s to exit' % (self.name, eof)
def __call__(self, code=None):
# Shells like IDLE catch the SystemExit, but listen when their
# stdin wrapper is closed.
try:
sys.stdin.close()
except:
pass
raise SystemExit(code)
__builtin__.quit = Quitter('quit')
__builtin__.exit = Quitter('exit')
콜러블이란 둥근 괄호()를 사용하여 최종적으로 함수와 마찬가지로 일부 파라미터를 전달할 수 있는 객체입니다.
함수 python을 정의할 때마다 호출 가능한 개체가 생성됩니다.예를 들어, 다음과 같은 방법으로 함수 펑크를 정의할 수 있습니다(동일).
class a(object):
def __call__(self, *args):
print 'Hello'
func = a()
# or ...
def func(*args):
print 'Hello'
doit이나 run 등의 메서드 대신 이 메서드를 사용할 수 있습니다.obj.doit()보다 obj()가 더 명확하다고 생각합니다.
거꾸로 설명하겠습니다.
생각해 보세요...
foo()
... 통사당으로서 다음을 위한:
foo.__call__()
서 ★★★★★foo 가 될 수 .__call__제가 어떤 오브젝트라고 할 때, 그것은 진심입니다: 빌트인 타입, 당신의 클래스, 그리고 그 인스턴스.
빌트인 타입의 경우는, 다음과 같이 기술합니다.
int('10')
unicode(10)
기본적으로 다음과 같은 작업을 수행합니다.
int.__call__('10')
unicode.__call__(10)
그리고 그게 바로 네가 이 모든 걸 할 수 없는 이유야.foo = new intPython의 경우: 클래스 오브젝트가 그 인스턴스를 반환하도록 할 뿐입니다.__call__Python이 이것을 해결하는 방법은 매우 우아하다고 생각합니다.
Callable은 다음 명령어를 가진 객체입니다.__call__방법.즉, 호출 가능한 함수를 속일 수도 있고, Partial Function Application과 같은 깔끔한 작업을 할 수도 있습니다.이 경우 함수를 강화하거나 파라미터를 채우는 기능을 추가해 호출할 수 있는 기능(기능 프로그래밍 서클에서는 Currying)을 반환할 수도 있습니다.
특정 타이포그래피 오류는 인터프리터가 문자열 등 의도하지 않은 호출을 시도합니다.이로 인해 인터프리터가 호출 불가능한 응용 프로그램을 실행하려고 할 때 오류가 발생할 수 있습니다.python interpreter에서는 아래 transcript와 같은 작업을 하면 이러한 현상이 발생하는 것을 볼 수 있습니다.
[nigel@k9 ~]$ python
Python 2.5 (r25:51908, Nov 6 2007, 15:55:44)
[GCC 4.1.2 20070925 (Red Hat 4.1.2-27)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 'aaa'() # <== Here we attempt to call a string.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>>
__call__는 임의의 오브젝트를 함수로 호출할 수 있도록 합니다.
다음 예에서는 8을 출력합니다.
class Adder(object):
def __init__(self, val):
self.val = val
def __call__(self, val):
return self.val + val
func = Adder(5)
print func(3)
간단하게 말하면, 「콜 가능」은, 메서드라고 부를 수 있는 것입니다.내장된 함수 "callable()"은 콜 속성을 확인하는 것과 마찬가지로 콜이 가능한 것으로 보이는지 여부를 알려줍니다.함수는 클래스와 마찬가지로 호출할 수 있으며 클래스 인스턴스도 호출할 수 있습니다.자세한 것은 이쪽과 이쪽을 봐 주세요.
Python에서 callable은 타입이 다음을 가진 객체입니다.__call__방법:
>>> class Foo:
... pass
...
>>> class Bar(object):
... pass
...
>>> type(Foo).__call__(Foo)
<__main__.Foo instance at 0x711440>
>>> type(Bar).__call__(Bar)
<__main__.Bar object at 0x712110>
>>> def foo(bar):
... return bar
...
>>> type(foo).__call__(foo, 42)
42
그 정도로 심플합니다.
물론 이것은 과부하가 될 수 있습니다.
>>> class Foo(object):
... def __call__(self):
... return 42
...
>>> f = Foo()
>>> f()
42
뒤에 (아그)를 붙이고 효과를 기대할 수 있는 것입니다.콜 가능은 보통 메서드 또는 클래스입니다.메서드가 호출되고 클래스가 인스턴스화됩니다.
함수나 수업 방식이 호출 가능한지 확인하는 것은 그 함수를 호출할 수 있다는 것을 의미합니다.
Class A:
def __init__(self,val):
self.val = val
def bar(self):
print "bar"
obj = A()
callable(obj.bar)
True
callable(obj.__init___)
False
def foo(): return "s"
callable(foo)
True
callable(foo())
False
콜러블은__call__이러한 메서드를 사용하는 모든 오브젝트를 호출할 수 있도록 특별한 메서드를 사용합니다.
Callable은 메서드 호출을 사용하는 "Built-in function or Method" 유형 또는 클래스입니다.
>>> type(callable)
<class 'builtin_function_or_method'>
>>>
예: print는 호출 가능한 객체입니다.삽입 함수 호출을 사용하여 print 함수를 호출하면 Python은 type print 객체를 생성하고 매개 변수가 있는 경우 메서드 호출을 호출합니다.
>>> type(print)
<class 'builtin_function_or_method'>
>>> print.__call__(10)
10
>>> print(10)
10
>>>
언급URL : https://stackoverflow.com/questions/111234/what-is-a-callable
'programing' 카테고리의 다른 글
| JavaScript 형식 지정으로 문자열을 datetime으로 변환하려면 어떻게 해야 합니까? (0) | 2022.10.14 |
|---|---|
| 모든 div 콘텐츠를 비활성화하는 방법 (0) | 2022.10.14 |
| 도커에서 분리 실행 시 Python 앱이 인쇄되지 않음 (0) | 2022.10.14 |
| 사용자가 위로 스크롤하지 않는 한 오버플로 div를 아래로 스크롤 유지 (0) | 2022.10.14 |
| JavaScript에서 문자열을 정수로 변환하려면 어떻게 해야 합니까? (0) | 2022.10.14 |