2017-02-22 15 views
6

पायथन में अंतर्निहित फ़ंक्शन type है और प्रत्येक इंस्टेंस में __class__ विशेषता भी है। मुझे आमतौर पर विश्वास था कि वे एक ही चीज़ लौट आए। यहां तक ​​कि दोनों के प्रलेखन समान लगता है:प्रकार (उदाहरण) उदाहरण क्यों नहीं है .__ class__?

instance.__class__

वर्ग जो एक वर्ग उदाहरण संबंधित है।

और

type(object)

एक तर्क के साथ

, एक वस्तु के प्रकार के वापस जाएँ।

abc.ABCMeta.__instancecheck__ में

हालांकि एक चेक वहाँ है अगर वे समान (थोड़ा छोटा) कर रहे हैं:

subclass = instance.__class__ 
subtype = type(instance) 
if subtype is subclass: 

जब यह मामला नहीं हो जाएगा? type(instance)instance.__class__ जैसा नहीं है?

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/9610993/python-type-or-class-or-is – Kasramvd

+0

@Kasramvd उस लिंक के लिए धन्यवाद, मेरा मानना ​​है कि यह शायद http: // stackoverflow का डुप्लिकेट है। com/प्रश्न/1060499/अंतर-बीच-typeobj और obj श्रेणी। मुझे यकीन नहीं है कि सवाल पूछते समय उन्होंने सवाल क्यों नहीं उठाया और न ही "प्रस्तावित डुप्लिकेट" में। – MSeifert

+0

हाँ कभी-कभी होता है;) – Kasramvd

उत्तर

2

यह पुराने शैली की वस्तुओं (कुछ भी नहीं से विरासत) के मामले में है। ऐसी वस्तुओं में __class__ संपत्ति नहीं है। मुझे लगता है कि वे त्रुटियों को रोकने के लिए ऐसा करते हैं। अजगर 2.7 के लिए उदाहरण:

class A: 
    pass 

class B(object): 
    pass 

a = A() 
b = B() 

print(dir(a)) # ['__doc__', '__module__'] 
print(dir(b)) # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

print(b.__class__) # <class '__main__.B'> 
print(type(b))  # <class '__main__.B'> 

##################### 
# The intersting part 
print(a.__class__) # __main__.A 
print(type(a))  # <type 'instance'> 


print(B.__class__) # <type 'type'> 
print(type(B))  # <type 'type'> 

print(type(A))  # <type 'classobj'> 
#print(A.__class__) # AttributeError: class A has no attribute '__class__' 

अधिक जानकारी के लिए देखें:

नोट: CPython से दिया लाइनों बदल रहे थे में 2008 पिछली बार (commit), इसलिए यह वास्तव में एक संगतता प्रतीत होता है या वे इसके बारे में भूल गए हैं।

+0

जबकि यह समझ में आता है - मैं इसके बारे में सोच रहा था (स्पष्ट रूप से इसका उल्लेख करना भूल गया) पायथन 3.x के बारे में और अब कोई पुरानी शैली की कक्षाएं नहीं हैं । – MSeifert

+0

@MSeifert 2008 में पिछली बार (https://github.com/python/cpython/commit/68f5fbe94488b671ee6dfae74d918cc6a8eeca56) में cpython से दी गई रेखाएं बदली गईं, इसलिए यह एक संगतता प्रतीत होती है या वे इसके बारे में भूल गए हैं। – ppasler

+0

@MSeifert मैंने अपना जवाब अपडेट कर लिया है। – ppasler

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