यहाँ दो कार्यों का एक सरल खोज है। मैंने इस अभ्यास के माध्यम से इसे रोशन पाया। मैं अक्सर एक साधारण इन और सरल कार्यों का बहिष्कार की खोज कार्यक्रम बना सकते हैं और संदर्भ के लिए बचत होगी:
#
# 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 कॉल उपयोग करना होगा।
यह आपको कुछ परिप्रेक्ष्य देना चाहिए: http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html#object-type-example – karthikr
@karthikr सहमत, महान लेख – jamylak
या इस सवाल http पर एक नजर है: //stackoverflow.com/questions/100003/what-is-a-metaclass-in-python?rq=1 और महान जवाब, जबकि मेटाक्लास के बारे में यह मेटाक्लास के वर्णन को बनाने के लिए प्रकारों और वस्तुओं का विवरण देता है - वास्तव में अच्छा पढ़ें। –