2012-05-05 13 views
8

मैं अगर एक वस्तु वर्ग की एक सूची/समूह में किसी भी वर्ग का एक उदाहरण है जाँच करना चाहते हैं, लेकिन मैं अगर वहाँ भीकई कक्षाओं के साथ विरासत की तुलना कैसे करें?

if isinstance(obj, Class1) or isinstance(obj, Class2) ... or isinstance(obj, ClassN): 
    # proceed with some logic 

मेरा मतलब है ऐसा किए बिना ऐसा करने का एक pythonic तरीका नहीं मिल रहा वर्ग द्वारा वर्ग की तुलना।

isinstance के समान कुछ फ़ंक्शन का उपयोग करने की अधिक संभावना होगी जो कि कक्षाओं की संख्या की तुलना में तुलना करने के लिए कक्षाओं की संख्या प्राप्त करेगी।

आपकी मदद के लिए अग्रिम धन्यवाद !! :)

+4

यह कैसे हो सकता है कि 'सहायता (स्थापना) 'एसओ को पोस्ट करने के लिए समय लेने से कठिन है? o_0 – rantanplan

+0

यह ध्यान देने योग्य है कि चेकिंग प्रकार/वर्ग [आमतौर पर निराश] है (http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in-python)। बतख-टाइपिंग और 'कोशिश'/'को छोड़कर 'बेहतर अभ्यास माना जाता है। – yentsun

उत्तर

25

आप कक्षाओं के एक समूह को प्रतिष्ठा के लिए दूसरे तर्क के रूप में पारित कर सकते हैं।

>>> isinstance(u'hello', (basestring, str, unicode)) 
True 

docstring भी होता अवलोकन किया जा रहा तुमसे कहा था कि हालांकि;)

>>> help(isinstance) 
Help on built-in function isinstance in module __builtin__: 

isinstance(...) 
    isinstance(object, class-or-type-or-tuple) -> bool 

    Return whether an object is an instance of a class or of a subclass thereof. 
    With a type as second argument, return whether that is the object's type. 
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for 
    isinstance(x, A) or isinstance(x, B) or ... (etc.). 
+0

'इंस्टीटेंस (एक्स, ए) और आईएसआईएसटीएन (एक्स, बी)' के बारे में क्या? क्या ऐसा करने का कोई आसान तरीका है? –

2

isinstance(obj, (Class1, Class2, ..., ClassN)), या isinstance(obj, BaseClass) अगर वे एक आम पूर्वज है।

उसने कहा, आपको इसका उपयोग करने से पहले दो बार सोचना चाहिए। इस तरह की स्पष्ट प्रकार की जांच कोड की सामान्यता को नुकसान पहुंचा सकती है, इसलिए आपके पास बतख को दूर करने के लिए बेहतर कारण होगा।

-1

हालांकि उपवर्ग की जांच के बिना यह करने के लिए, एक और तरीका है:

>>> obj = Class2() 
>>> type(obj) in (Class1, Class2, Class3) 
True 

नोट। शायद यह केवल व्यावहारिक उपयोग के लिए नहीं, विचार करने के लिए है।

+0

वही नहीं। यह उपनिवेशों को 'बहाली' जैसी नहीं मानेंगे। –

+0

@CatPlusPlus मैं उस – yentsun

+1

@yentsun पर एक नोट बनाउंगा, यह पुरानी शैली कक्षाओं के साथ भी अच्छी तरह से खेल नहीं है। 'कक्षा ए: पास' और' कक्षा बी: पास 'उदाहरणों का एक ही प्रकार का' 'होगा और परीक्षण में विफल हो जाएगा। –

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