programing

'콜 가능'이란?

sourcejob 2022. 10. 14. 21:39
반응형

'콜 가능'이란?

메타클래스가 무엇인지 확실히 알 수 있게 되었기 때문에 저는 메타클래스의 진정한 의미를 모른 채 항상 사용하는 관련 개념이 있습니다.

누구나 한번 괄호를 틀리면 "객체는 호출할 수 없습니다" 예외가 발생한다고 생각합니다. 가가 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

Python의 sources object.c:

/* 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;
    }
}

다음과 같이 되어 있습니다.

  1. 오브젝트가 어떤 클래스의 인스턴스인 경우, 그 오브젝트가 다음과 같은 경우 호출할 수 있습니다.__call__여하하다
  2. 않으면 "" " " " " " "x호출 가능한 iff x->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

반응형