2013-03-30 6 views
10

में एक 'वस्तु' मैं super कीवर्ड पर अजगर documentation पढ़ने इस पर आया के बीच अंतर है:क्या 'टाइप' और अजगर

तो दूसरा तर्क छोड़ दिया जाता है, सुपर वस्तु लौटे अबाध है । यदि दूसरा तर्क एक वस्तु है, तो इंस्टेंसेंस (ओबीजे, प्रकार) सत्य होना चाहिए। यदि दूसरा तर्क एक प्रकार है, issubclass (टाइप 2, प्रकार) सत्य होना चाहिए (यह classmethods के लिए उपयोगी है)।

क्या कोई मुझे ऑब्जेक्ट पास करने के विरुद्ध दूसरे तर्क के रूप में टाइप को पार करने के बीच एक भेद का उदाहरण दे सकता है?

क्या प्रलेखन किसी ऑब्जेक्ट के उदाहरण के बारे में बात कर रहा है?

धन्यवाद।

+9

यह आपको कुछ परिप्रेक्ष्य देना चाहिए: http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#object-type-example – karthikr

+0

@karthikr सहमत, महान लेख – jamylak

+3

या इस सवाल http पर एक नजर है: //stackoverflow.com/questions/100003/what-is-a-metaclass-in-python?rq=1 और महान जवाब, जबकि मेटाक्लास के बारे में यह मेटाक्लास के वर्णन को बनाने के लिए प्रकारों और वस्तुओं का विवरण देता है - वास्तव में अच्छा पढ़ें। –

उत्तर

0

ऑब्जेक्ट कोई पाइथन क्लास इंस्टेंस हो सकता है जो उपयोगकर्ता परिभाषित हो सकता है या नहीं भी हो सकता है। लेकिन, जब आप एक प्रकार बारे में बात कर रहे हैं, यह डिफ़ॉल्ट वस्तुओं/संग्रह तरह को संदर्भित करता है एक सूची/टपल/dict/पूर्णांक/str आदि

+0

मैं w.r.t. को अलग करना चाहता हूं, यह ** ** ** निर्मित नहीं है। हर कोई अपने स्वयं के प्रकार परिभाषित कर सकता है और करता है। – delnan

+0

@smitkpatel, मुझे लगता है कि आप "बिल्टिन" प्रकारों के बारे में सोच रहे हैं। – Demolishun

+0

बिल्टिन - डिफ़ॉल्ट आलू - आलू – smitkpatel

0

यहाँ दो कार्यों का एक सरल खोज है। मैंने इस अभ्यास के माध्यम से इसे रोशन पाया। मैं अक्सर एक साधारण इन और सरल कार्यों का बहिष्कार की खोज कार्यक्रम बना सकते हैं और संदर्भ के लिए बचत होगी:

# 
# Testing isinstance and issubclass 
# 

class C1(object): 
    def __init__(self): 
     object.__init__(self) 

class B1(object): 
    def __init__(self): 
     object.__init__(self) 

class B2(B1): 
    def __init__(self): 
     B1.__init__(self) 

class CB1(C1,B1): 
    def __init__(self): 
     # not sure about this for multiple inheritance 
     C1.__init__(self) 
     B1.__init__(self) 

c1 = C1() 
b1 = B1() 
cb1 = CB1() 

def checkInstanceType(c, t): 
    if isinstance(c, t): 
     print c, "is of type", t 
    else: 
     print c, "is NOT of type", t 

def checkSubclassType(c, t): 
    if issubclass(c, t): 
     print c, "is a subclass of type", t 
    else: 
     print c, "is NOT a subclass of type", t 

print "comparing isinstance and issubclass" 
print "" 

# checking isinstance 
print "checking isinstance" 

# can check instance against type 
checkInstanceType(c1, C1) 
checkInstanceType(c1, B1) 
checkInstanceType(c1, object) 

# can check type against type 
checkInstanceType(C1, object) 
checkInstanceType(B1, object) 

# cannot check instance against instance 
try: 
    checkInstanceType(c1, b1) 
except Exception, e: 
    print "failed to check instance against instance", e 

print "" 

# checking issubclass 
print "checking issubclass" 

# cannot check instance against type 
try: 
    checkSubclassType(c1, C1) 
except Exception, e: 
    print "failed to check instance against type", e 

# can check type against type 
checkSubclassType(C1, C1) 
checkSubclassType(B1, C1) 
checkSubclassType(CB1, C1) 
checkSubclassType(CB1, B1) 

# cannot check type against instance 
try: 
    checkSubclassType(C1, c1) 
except Exception, e: 
    print "failed to check type against instance", e 

संपादित करें: इसके अलावा निम्नलिखित के रूप में isinstance एपीआई कार्यान्वयन तोड़ सकते हैं पर विचार करें। एक उदाहरण एक वस्तु होगी जो एक शब्दकोश की तरह कार्य करता है, लेकिन यह dict से नहीं लिया गया है। isinstance जाँच कर सकते हैं कि एक वस्तु एक शब्दकोश है, भले ही वस्तु शब्दकोश शैली पहुँच का समर्थन: isinstance considered harmful

EDIT2:

किसी के रूप में एक प्रकार गुजर के बीच मुझे एक अंतर का एक उदाहरण दे सकते हैं ऑब्जेक्ट पास करने के विरुद्ध एक दूसरा तर्क?

उपर्युक्त कोड का परीक्षण करने के बाद यह मुझे बताता है कि दूसरा पैरामीटर एक प्रकार होना चाहिए। तो निम्न मामले में:

checkInstanceType(c1, b1) 

कॉल विफल हो जाएगा। यह लिखा जा सकता है:

checkInstanceType(c1, type(b1)) 

तो तुम एक और उदाहरण के खिलाफ एक उदाहरण के प्रकार की जांच करना चाहते हैं तो आप प्रकार() builtin कॉल उपयोग करना होगा।

3

पायथन का super फ़ंक्शन इसके तर्कों के आधार पर अलग-अलग चीजें करता है।यहाँ यह का उपयोग कर के विभिन्न तरीकों का एक प्रदर्शन है:

class Base(object): 
    def __init__(self, val): 
     self.val = val 

    @classmethod 
    def make_obj(cls, val): 
     return cls(val+1) 

class Derived(Base): 
    def __init__(self, val): 
     # In this super call, the second argument "self" is an object. 
     # The result acts like an object of the Base class. 
     super(Derived, self).__init__(val+2) 

    @classmethod 
    def make_obj(cls, val): 
     # In this super call, the second argument "cls" is a type. 
     # The result acts like the Base class itself. 
     return super(Derived, cls).make_obj(val) 

टेस्ट उत्पादन:

>>> b1 = Base(0) 
>>> b1.val 
0 
>>> b2 = Base.make_obj(0) 
>>> b2.val 
1 
>>> d1 = Derived(0) 
>>> d1.val 
2 
>>> d2 = Derived.make_obj(0) 
>>> d2.val 
3 

3 परिणाम पिछले संशोधक का संयोजन है: 1 (Base.make_obj से) प्लस 2 (Derived.__init__ से)।

ध्यान दें कि super को "अनबाउंड" सुपर ऑब्जेक्ट प्राप्त करने के लिए केवल एक तर्क के साथ कॉल करना संभव है, यह स्पष्ट रूप से बहुत उपयोगी नहीं है। ऐसा करने का कोई कारण नहीं है जब तक कि आप पाइथन आंतरिक के साथ गड़बड़ नहीं करना चाहते हैं और आप वास्तव में जानते हैं कि आप क्या कर रहे हैं।

पायथन 3 में, आप super को बिना किसी तर्क के कॉल कर सकते हैं (जो वर्तमान कक्षा और self को दो तर्कों के रूप में प्रदान करने के बराबर है, लेकिन अधिक जादुई)।

+0

फ़ंक्शन कॉल के ज्ञापन के साथ मदद करने के लिए सुपर तरीका है? मेरे पास एक ऑब्जेक्ट है जो फ़ंक्शंस अस्तित्व की जांच करके और फिर ऑब्जेक्ट पर किसी ऑब्जेक्ट को एक ऑब्जेक्ट असाइन करने के लिए कॉल करता है जो सीधे फ़ंक्शन को कॉल करता है। इसलिए मैं मूल रूप से केवल एक बार फ़ंक्शन को देखता हूं और इसे कॉल करने योग्य विशेषता में याद करता हूं। मुझे ऑब्जेक्ट का उपयोग करना है .__ setattr __ (स्वयं, "विशेषता", कॉल करने योग्य ओबीजे) इसे "__settr__" के मेरे पुनर्वितरण को लूपिंग/कॉल करने से रोकने के लिए। क्या सुपर एक ही काम करता है? – Demolishun

+0

@ डेमोलिशुन: उम, नहीं। आप ओवरराइड विधियों के विरासत संस्करणों को प्राप्त करने के लिए 'सुपर' का उपयोग करते हैं। [डॉक्स] देखें (http://docs.python.org/2/library/functions.html#super) – Blckknght

+0

ठीक है, तो यह समान है, लेकिन यह बेस क्लास के गतिशील संदर्भ की अनुमति देता है, लेकिन नाम से नहीं । यह एक प्रयोग का मामला है। http://rhettinger.wordpress.com/2011/05/26/super-Considered-super/ रेफरी के लिए धन्यवाद। – Demolishun

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