2014-07-11 13 views
5

यह थोड़ा मुश्किल इस व्यवहार को समझने के लिए किया जाता है:पायथन में, एक वस्तु कार्य करता है?

def a(): 
    pass 


type(a) 
>> function 

तो a की typefunction है, function की type क्या है?

type(function) 
>> NameError: name 'function' is not defined 

और क्यों a से type की typetype है करता है?

type(type(a)) 
>> type 

अंतिम एक: यदि a एक object है, कारण है कि मैं ऐसा नहीं कर सकते:

isinstance(a, object) 
>> True 


class x(a): 
    pass 
TypeError: Error when calling the metaclass bases 
    function() argument 1 must be code, not str 

धन्यवाद!

+0

वे सभी सही लगते हैं। आप 'प्रकार (फ़ंक्शन)' वापस आने की अपेक्षा करते हैं? – CoryKramer

+4

संभावित डुप्लिकेट ["प्रथम श्रेणी" ऑब्जेक्ट्स क्या हैं?] (Http://stackoverflow.com/questions/245192/what-are-first-class-objects) –

+0

संभव डुप्लिकेट [पायथन में मेटाक्लासस क्या है?] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python) – davidism

उत्तर

5

किसी भी फ़ंक्शन का प्रकार <type 'function'> है। फ़ंक्शन के प्रकार का प्रकार <type 'type'> है, जैसे कि आपको type(type(a)) मिल गया है। कारण type(function) काम नहीं करता है क्योंकि type(function)function नामक एक अविकसित चर के प्रकार को प्राप्त करने का प्रयास कर रहा है, वास्तविक कार्य के प्रकार (यानी function कोई कीवर्ड नहीं है)।

आपको अपनी कक्षा परिभाषा के दौरान मेटाक्लास त्रुटि मिल रही है क्योंकि afunction और can't subclass functions in Python प्रकार है।

अच्छी जानकारी in the docs की बहुत सारी जानकारी।

3

function का प्रकार type है, जो पायथन में आधार मेटाक्लास है। एक मेटाक्लास एक वर्ग की कक्षा है। आप ऑब्जेक्ट के प्रकार को बताने के लिए type का उपयोग फ़ंक्शन के रूप में भी कर सकते हैं, लेकिन यह एक ऐतिहासिक आर्टिफैक्ट है।

types मॉड्यूल आपको सबसे अधिक निर्मित प्रकारों के प्रत्यक्ष संदर्भ देता है।

>>> import types 
>>> def a(): 
... pass 
>>> isinstance(a, types.FunctionType) 
True 
>>> type(a) is types.FunctionType 

सिद्धांत रूप में, तुम भी वर्ग types.FunctionType सीधे दृष्टांत और हालांकि मैं कोई वास्तविक स्थिति कल्पना नहीं कर सकते जहां यह है कि ऐसा करने के लिए उचित है गतिशील रूप से एक समारोह बनाने के लिए, हो सकता है:

>>> import types 
>>> a = types.FunctionType(compile('print "Hello World!"', '', 'exec'), {}, 'a') 
>>> a 
<function a at 0x01FCD630> 
>>> a() 
Hello World! 
>>> 

आप कर सकते हैं ' टी फ़ंक्शन को उप-वर्गीकृत करें, यही कारण है कि आपका अंतिम स्निपेट विफल रहता है, लेकिन आप types.FunctionType को उप-वर्ग नहीं कर सकते हैं।

संबंधित मुद्दे