आप नहीं कर सकते। जैसा कि जोनशर्प बताते हैं, Child
को विशेषता नहीं है, और callable(Child())
इसका उत्तर देने के लिए निर्भर करता है। यहां तक कि AttributeError
उठाए जाने वाले एक वर्णक को भी यह काम नहीं करेगा, इस बग रिपोर्ट के अनुसार: https://bugs.python.org/issue23990। एक अजगर 2 उदाहरण:
>>> class Parent(object):
... def __call__(self): pass
...
>>> class Child(Parent):
... __call__ = property()
...
>>> c = Child()
>>> c()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: unreadable attribute
>>> c.__call__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: unreadable attribute
>>> callable(c)
True
इसका कारण यह है callable(...)
वर्णनकर्ता प्रोटोकॉल बाहर काम नहीं करता है। असल में ऑब्जेक्ट को कॉल करना, या __call__
विशेषता का उपयोग करना, सामान्य डिस्क्रिप्टर प्रोटोकॉल के माध्यम से, किसी संपत्ति के पीछे होने पर भी विधि को पुनर्प्राप्त करना शामिल है। लेकिन callable(...)
अब तक जाने से परेशान नहीं है, अगर इसे कुछ भी मिल जाए तो यह संतुष्ट है, और माता-पिता के प्रत्येक उप-वर्ग में __call__
के लिए होगा - या तो सबक्लास में एक विशेषता, या Parent
की परिभाषा।
तो जब आप वास्तव में किसी भी अपवाद के साथ उदाहरण को कॉल कर सकते हैं, तो आप कभी भी callable(some_instance_of_parent)
वापस झूठ नहीं बना सकते हैं।
स्रोत
2015-05-13 21:37:32
यह प्रश्न पूछता है, क्या यह एक अच्छा वर्ग है कि बच्चे वर्ग में अभिभावक वर्ग के इंटरफेस को तोड़ना अच्छा विचार है? –
'कॉल करने योग्य (ओबीजे) 'चेक' हैशटर (ओबीजे,' __call __ ') '; मुझे नहीं लगता कि आप 'चाइल्ड' को विशेषता नहीं दे सकते हैं, क्योंकि यह विरासत तोड़ देगा। – jonrsharpe
क्या यह '__call__' संदर्भ' del' पर काम करेगा? – TigerhawkT3