पायथन के स्रोतों से ऑब्जेक्ट ।.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;
}
}
इसे कहते हैं:
- यदि कोई वस्तु किसी वर्ग का उदाहरण है तो यह गुणकारी iff है, तो इसका
__call__
गुण है।
- वस्तु
x
को कॉल करने योग्य iff है x->ob_type->tp_call != NULL
की Desciption tp_call
क्षेत्र :
ternaryfunc tp_call
एक फ़ंक्शन के लिए एक वैकल्पिक सूचक जो ऑब्जेक्ट को कॉल करने वाले उपकरण को लागू करता है। यदि ऑब्जेक्ट कॉल करने योग्य नहीं है तो यह NULL होना चाहिए। हस्ताक्षर PyObject_Call () के लिए समान है। यह क्षेत्र उपप्रकारों द्वारा विरासत में मिला है।
आप हमेशा callable
निर्धारित फ़ंक्शन का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि दी गई वस्तु कॉल करने योग्य है या नहीं; या बेहतर अभी तक बस इसे कॉल करें और TypeError
बाद में पकड़ लें । callable
पायथन 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)
मानक लाइब्रेरी, फ़ाइल site.py
, बिल्ट-इन 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')