ভেরিয়েবল একটি শ্রেণি কিনা তা কীভাবে পরীক্ষা করবেন?


236

আমি ভাবছিলাম কীভাবে ভেরিয়েবল একটি শ্রেণি (উদাহরণ নয়!) কিনা তা যাচাই করব।

এটি করার জন্য আমি ফাংশনটি ব্যবহার করার চেষ্টা করেছি isinstance(object, class_or_type_or_tuple), তবে ক্লাসে কী ধরণের হবে তা আমি জানি না।

উদাহরণস্বরূপ, নিম্নলিখিত কোডে

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

আমি " class" এর সাথে বিকল্পের চেষ্টা করেছি ??? , তবে আমি বুঝতে পেরেছিলাম যে classপাইথনের একটি কীওয়ার্ড।

উত্তর:


335

আরও ভাল: 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
@ মাইক্রেলমায়ার type(whatever)সর্বদা একটি শ্রেণি হিসাবে এমন কোনও বস্তু ফেরত দেয়, তাই এই চেকটি অপ্রয়োজনীয়। যদি এটি না ঘটে তবে তাত্ক্ষণিকভাবে কোনও উপায় থাকত না whateverএবং এভাবে আপনি প্রথম স্থানে চেকটি সম্পাদন করতে পারবেন না।
a_guest

আমার জন্য কাজ করে না। অজগর 3 স্নাপমেক ব্যবহার করে type(snakemake.utils)ফিরে আসে <class 'module'>এবং inspect.isclass(snakemake.utils)ফিরে আসে False
আজ 16

3
এটি কারণ snakemake.utilএকটি মডিউল একটি শ্রেণি না?
বেনিয়ামিন পিটারসন

44

ইন্সপেক্ট.আইক্লাস সম্ভবত সেরা সমাধান এবং এটি বাস্তবে কীভাবে বাস্তবায়িত হয়েছে তা সহজেই পাওয়া সহজ

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
তেও

এটি পরিদর্শন মডিউল থেকে নেওয়া হয়েছিল তাই আমার সন্দেহ হয় এটি কার্যকর হয় না। পাইথন 2.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, ইত্যাদি হয় এছাড়াও ক্লাস, তাই আপনি এই ব্যবহার করতে পারবেন না মাঝে পার্থক্যটা উল্লেখ করা কাস্টম শ্রেণীর পাইথন সংজ্ঞায়িত এবং বিল্ট-ইন সি কোড সংজ্ঞায়িত শ্রেণীর
মার্টিজন পিটারস

39
>>> 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

1
@ জিয়াউংক: আপনি "ধরে নিচ্ছেন না যে পার্থক্যটি এসেছে ...", আপনি কোডটিতে আসলে এটি পড়ছেন। অবজেক্টের একটি সাবক্লাস ("নতুন স্টাইল") এর পছন্দসই বৈশিষ্ট্য রয়েছে, আপনি এখানে যা দেখছেন ঠিক তেমনই।
এস.লট

12
ইঙ্গিতটি এখানে - যেহেতু এটি নতুন-স্টাইলের ক্লাসগুলির জন্য কাজ করে, তাই পুরানো-শৈলীর ক্লাস ব্যবহার করবেন না। পুরানো স্টাইলের ক্লাসগুলি ব্যবহার করার কোনও মানে নেই।
এস। লট

isinstance (e, f) E হ'ল তাত্ক্ষণিক বস্তু, F হ'ল শ্রেণীর অবজেক্ট।
ডেক্সটার

24
isinstance(X, type)

Trueযদি ফিরে আসেX ক্লাস হয় এবং Falseযদি না।


3
আমি মিথ্যা পেয়েছি, যদিও এক্স ক্লাস হয়।
ম্যাডস স্কজার্ন

6
এটি কেবল নতুন স্টাইলের ক্লাসগুলির জন্য কাজ করে। ওল্ড স্টাইলের ক্লাসগুলি 'শ্রেণীবোজ' টাইপের হয়। সুতরাং আপনি যদি পুরানো শৈলীর ক্লাস ব্যবহার করেন তবে আপনি এটি করতে পারেন: প্রকার আমদানির ধরণ (এক্স, প্রকারের। ক্লাস টাইপ)
চার্লস এল।

2
এটি S. Lott's answerচার বছরের বড় হিসাবে একই হিসাবে প্রদর্শিত হবে ।
ইথান ফুরম্যান

5

এই চেকটি পাইথন 2.x এবং পাইথন 3.x উভয়ের সাথেই সামঞ্জস্যপূর্ণ is

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

1

ক্লাস ফু: বলা হয় পুরাতন স্টাইলের ক্লাস এবং ক্লাস এক্স (অবজেক্ট): নতুন স্টাইলের ক্লাস বলে।

এটি পরীক্ষা করে দেখুন পাইথনে পুরানো স্টাইল এবং নতুন স্টাইলের ক্লাসগুলির মধ্যে পার্থক্য কী? । নতুন স্টাইল সুপারিশ করা হয়। " একীকরণের ধরণ এবং শ্রেণি " সম্পর্কে পড়ুন


6
এটি সম্ভবত একটি মন্তব্য করা উচিত ছিল?
Kos

1

সবচেয়ে সহজ উপায় হ'ল inspect.isclassসর্বাধিক ভোটিত উত্তরের পোস্ট হিসাবে ব্যবহার করা।
বাস্তবায়নের বিশদটি পাইথন 2 পরিদর্শন এবং পাইথন 3 পরিদর্শনে পাওয়া যাবে ।
নতুন স্টাইলের ক্লাসের isinstance(object, type)
জন্য : পুরাতন স্টাইলের ক্লাসের জন্য: isinstance(object, types.ClassType)
এম, ওল্ড স্টাইল ক্লাসের জন্য, এটি ব্যবহার করছে types.ClassType, টাইপস.পি থেকে কোডটি এখানে :

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

1

inspect.isclass()এই কাজের জন্য ব্যবহার সম্পর্কে বেঞ্জামিন পিটারসন সঠিক । তবে মনে রাখবেন যে কোনও Classবস্তুটি একটি নির্দিষ্ট Classএবং আপনি অন্তর্নির্মিত Classফাংশন ইস্যুব্লাক্লাস ব্যবহার করে স্পষ্টতই একটি পরীক্ষা করতে পারেন । আপনার ব্যবহারের উপর নির্ভর করে এটি আরও পাইথোনিক হতে পারে।

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

-2

এখানে ইতিমধ্যে কিছু কার্যক্ষম সমাধান রয়েছে তবে এখানে আরও একটি রয়েছে:

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

types.ClassTypeপাইথন 3
বউ বার্কার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.