2012-03-14 19 views
15

कक्षाकी कक्षा का उदाहरण कैसे संभव है, कक्षा object का उप-वर्ग होने के बिना? यहाँ एक उदाहरण है:इंस्टेंस एक "ऑब्जेक्ट" है, लेकिन कक्षा "ऑब्जेक्ट" का उप-वर्ग नहीं है: यह कैसे संभव है?

isinstance(123, object) # True 
isinstance("green cheese", object) # True 
isinstance(someOldClassObject, object) # True 
isinstance(someNewClassObject, object) # True 
isinstance(object, object) # True 
isinstance(None, object) # True 

नोट इस सवाल का अनिवार्य रूप से कुछ भी नहीं old- बनाम नई शैली कक्षाओं के साथ क्या करना है:

>>> class OldStyle(): pass 
>>> issubclass(OldStyle, object) 
False 
>>> old_style = OldStyle() 
>>> isinstance(old_style, object) 
True 

उत्तर

18

अजगर 2 में, प्रकार और वर्ग नहीं एक ही बात, विशेष रूप से, पुरानी शैली कक्षाओं के लिए, type(obj)is not the same objectobj.__class__ के रूप में कर रहे हैं। तो यह संभव है क्योंकि पुरानी शैली वर्गों के उदाहरण एक अलग प्रकार (instance) अपनी कक्षा से की वास्तव में कर रहे हैं:

>>> class A(): pass 
>>> class B(A): pass 
>>> b = B() 

>>> assert b.__class__ is B 
>>> issubclass(b.__class__, A) # same as issubclass(B, A) 
True 
>>> issubclass(type(b), A) 
False 

>>> type(b) 
<type 'instance'> 
>>> b.__class__ 
<class __main__.B at 0x10043aa10> 

इस नई शैली की कक्षाओं में हल हो गई है:

>>> class NA(object): pass 
>>> class NB(NA): pass 
>>> nb = NB() 
>>> issubclass(type(nb), NA) 
True 
>>> type(nb) 
<class '__main__.NB'> 
>>> nb.__class__ 
<class '__main__.NB'> 

पुरानी शैली कक्षा एक प्रकार नहीं है, नई शैली की कक्षा है:

>>> isinstance(A, type) 
False 
>>> isinstance(NA, type) 
True 

पुरानी शैली कक्षाओं को अस्वीकार कर दिया गया है। पायथन 3 में, केवल नए शैली के वर्ग हैं; class A()class A(object) के बराबर है और आपका कोड दोनों चेक में True देगा। What is the difference between old style and new style classes in Python?

+0

+1: यह एक बहुत ही स्पष्ट वर्णन है, और एक बहुत अच्छा बिंदु है। धन्यवाद! – EOL

+0

किसी को भी सोचने के लिए, 'आईइंस्टेंस' [विशेष-आधारित] है (https://github.com/python/cpython/blob/e6a0b5982973e64b9fa28e5e3e54eb8c47882780/Objects/abstract.c#L2898) पुरानी शैली के उदाहरणों और कक्षाओं के लिए (यानी 'PyClass_Check (सीएलएस) और PyInstance_Check (inst) 'सी में)। चूंकि कोई प्रकार-आधारित संबंध नहीं है, इसलिए इसे 'जारी करने वाले' चेक के लिए उदाहरण के '__class__' मिलते हैं, जो [विशेष-आधारित] भी है (https://github.com/python/cpython/blob/e6a0b5982973e64b9fa28e5e3e54eb8c47882780/Objects /classobject.c#L486) पुराने शैली के वर्गों के लिए। – eryksun

6

सब कुछ एक वस्तु है। isinstance(old_style, object)True इस तथ्य का एक सारांश है कि पाइथन में प्रत्येक मान object का उदाहरण है।

+0

आप इस पर एक संदर्भ है:

कुछ और चर्चा के लिए इस सवाल का पर एक नजर डालें? – EOL

+1

@EOL: [यह एक] (http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html) काफी उपयोगी है – georg

+1

धन्यवाद। मैंने संदर्भ पर एक नज़र डाली, लेकिन मुझे इस विचार का कोई संकेत नहीं मिला कि पाइथन में सबकुछ * टाइप * 'ऑब्जेक्ट 'है (तथ्य यह है कि" सब कुछ एक वस्तु है "पायथन में एक ही चीज़ का मतलब नहीं है)। – EOL

1

जब आप अभिव्यक्ति

old_style = OldStyle() 

इसका मतलब है कि आप वस्तु है, जो old_style वर्ग ओल्डस्टएल का एक उदाहरण है instantiating रहे हैं।

इसके अलावा, दोनों पायथन 3.2 में सत्य का मूल्यांकन करते हैं।

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

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