कैसे जांचें कि एक चर एक वर्ग है या नहीं?


251

मैं सोच रहा था कि कैसे जांचा जाए कि एक चर एक वर्ग है (उदाहरण नहीं!) या नहीं।

मैंने ऐसा करने के लिए फ़ंक्शन का उपयोग करने की कोशिश की है isinstance(object, class_or_type_or_tuple), लेकिन मुझे नहीं पता कि कक्षा किस प्रकार की होगी।

उदाहरण के लिए, निम्नलिखित कोड में

class Foo: pass  
isinstance(Foo, **???**) # i want to make this return True.

मैंने " class" को स्थानापन्न करने की कोशिश की ??? , लेकिन मुझे एहसास हुआ कि classअजगर में एक कीवर्ड है।

जवाबों:


356

और भी बेहतर: inspect.isclassफ़ंक्शन का उपयोग करें ।

>>> import inspect
>>> class X(object):
...     pass
... 
>>> inspect.isclass(X)
True

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False

7
यदि आप भी inspect.isclassलौटना चाहते हैं Trueयदि निरीक्षण करने के लिए वस्तु एक वर्ग उदाहरण है , तो उपयोग करेंinspect.isclass(type(Myclass()))
michaelmeyer

8
इससे बेहतर क्या :)?
मैड फिजिसिस्ट

8
@michaelmeyer type(whatever)हमेशा एक ऑब्जेक्ट देता है जो एक वर्ग है, इसलिए यह चेक बेमानी है। अगर ऐसा नहीं होता तो तुरंत रास्ता तय नहीं होता whateverऔर इस तरह आप पहले स्थान पर चेक नहीं कर पाते।
a_guest

मेरे लिए काम नहीं करता है। Python3 का उपयोग snakemake के साथ, type(snakemake.utils)रिटर्न <class 'module'>और फिर भी inspect.isclass(snakemake.utils)रिटर्न False
tedtoal

3
ऐसा इसलिए snakemake.utilहै क्योंकि एक मॉड्यूल एक वर्ग नहीं है?
बेंजामिन पीटरसन

45

इंस्पेक्ट.स्किल्स शायद सबसे अच्छा समाधान है, और यह वास्तव में यह देखना आसान है कि यह वास्तव में कैसे लागू किया जाता है

def isclass(object):
    """Return true if the object is a class.

    Class objects provide these attributes:
        __doc__         documentation string
        __module__      name of module in which this class was defined"""
    return isinstance(object, (type, types.ClassType))

5
याद रखेंimport types
nguyên

13
types.ClassTypeअजगर 3 में अब जरूरत नहीं है (और हटा दिया गया है)।
कविंग-चीउ

यह बिल्कुल भी नई शैली की कक्षाओं के साथ काम नहीं करता है .... यहां तक ​​कि अजगर में भी 2. अकेले इस समाधान का उपयोग न करें
एरिक एरोनिटी

यह निरीक्षण मॉड्यूल से लिया गया था, इसलिए मुझे संदेह है कि यह काम नहीं करता है। उदाहरण के लिए Python2.7 के साथ जांच करना सरल हैIn [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
andrea_crotti

यह पायथन 2 कार्यान्वयन है, जिसे पुरानी शैली और नई शैली की कक्षाओं को संभालना है। अजगर 3 इसे सरल करता है isinstance(object, type)। ध्यान दें कि वस्तुओं की तरह int, list, str, आदि कर रहे हैं भी कक्षाएं, तो आप इस का उपयोग नहीं कर सकते हैं के बीच अंतर करने के लिए कस्टम कक्षाओं अजगर में परिभाषित किया गया है और निर्मित सी कोड में परिभाषित वर्गों
मार्टिन पीटर्स

41
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True

1
हम्म ... अच्छा जवाब है, लेकिन जब मैं अपने फू कक्षा पर टाइप (फू) करता हूं, तो यह <टाइप 'टाइप' के बजाय <टाइप 'क्लासोबज'> कहता है। मुझे लगता है कि अंतर इस तथ्य से आता है कि एक्स ऑब्जेक्ट से विरासत में मिला है, लेकिन फू नहीं है। क्या इससे कोई और अंतर पैदा हो रहा है? धन्यवाद।
jeeyoungk

6
यह पुरानी शैली की कक्षाओं के लिए काम नहीं करता है: 'class Old:pass' 'isinstance(Old, type) == False'लेकिन inspect.isclass(Old) == True
jfs

2
@ जियॉन्गकुक: आप "यह मानकर नहीं कि अंतर से आता है ...", आप वास्तव में कोड में पढ़ रहे हैं। ऑब्जेक्ट के एक उपवर्ग ("नई शैली") में वांछित गुण हैं, बस जो आप यहां देखते हैं।
एस.लॉट

12
यहाँ संकेत है - चूँकि यह नई शैली की कक्षाओं के लिए काम करता है, इसलिए पुरानी शैली की कक्षाओं का उपयोग न करें। पुरानी शैली की कक्षाओं का उपयोग करने का कोई मतलब नहीं है।
S.Lott

isinstance (e, f) E तात्कालिक वस्तु है, F वर्ग वस्तु है।
डेक्सटर

27
isinstance(X, type)

Trueअगर Xक्लास है और Falseनहीं तो वापसी ।


3
मुझे गलत लगता है, भले ही एक्स एक वर्ग हो।
मैड्स स्केजर्न

6
यह केवल नई शैली की कक्षाओं के लिए काम करता है। पुरानी शैली की कक्षाएं 'क्लासोबज' प्रकार की होती हैं। इसलिए यदि आप पुरानी शैली की कक्षाओं का उपयोग कर रहे हैं, तो आप कर सकते हैं: आयात प्रकार आइंस्टीन (X, type.ClassType)
चार्ल्स एल।

2
यह वही प्रतीत होता है S. Lott's answer, जो चार साल पुराना है।
एथन फुरमैन

6

यह जांच दोनों पायथन 2.x और पायथन 3.x के साथ संगत है।

import six
isinstance(obj, six.class_types)

यह मूल रूप से एक आवरण फ़ंक्शन है जो andrea_crotti उत्तर के समान जांच करता है।

उदाहरण:

>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False

2

बेंजामिन पीटरसन inspect.isclass()इस नौकरी के उपयोग के बारे में सही है । लेकिन ध्यान दें कि आप परीक्षण कर सकते हैं कि कोई Classवस्तु विशिष्ट है Class, और इसलिए अंतर्निहित ए Classका उपयोग करके, अंतर्निहित फ़ंक्शन issubclass है । आपके उपयोग-मामले के आधार पर यह अधिक पायथोनिक हो सकता है।

from typing import Type, Any
def isclass(cl: Type[Any]):
    try:
        return issubclass(cl, cl)
    except TypeError:
        return False

तब इस तरह इस्तेमाल किया जा सकता है:

>>> class X():
...     pass
... 
>>> isclass(X)
True
>>> isclass(X())
False

1

वर्ग फू: को पुरानी शैली वर्ग और कक्षा X (वस्तु) कहा जाता है: नई शैली वर्ग कहा जाता है।

यह जांचें कि पायथन में पुरानी शैली और नई शैली वर्गों के बीच क्या अंतर है? । नई शैली की सिफारिश की है। " एकीकृत प्रकार और कक्षाएं " के बारे में पढ़ें


6
यह शायद एक टिप्पणी होनी चाहिए थी?
कोस

1

सबसे आसान तरीका यह है inspect.isclassकि सबसे अधिक वोट किए गए उत्तर में पोस्ट किया जाए।
कार्यान्वयन विवरण पाया जा सकता है पर को Python2 का निरीक्षण किया और python3 का निरीक्षण किया
नई-शैली वर्ग के लिए: isinstance(object, type)
पुराने-शैली वर्ग के लिए: isinstance(object, types.ClassType)
em, पुराने-शैली वर्ग के लिए, यह उपयोग कर रहा है types.ClassType, यहाँ टाइपसेफ़ से कोड है :

class _C:
    def _m(self): pass
ClassType = type(_C)

-2

यहां पहले से ही कुछ काम कर रहे समाधान हैं, लेकिन यहां एक और एक है:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True

types.ClassTypeअजगर 3 में हटा दिया गया था
ब्यू बार्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.