如何检查一个变量是否是一个类?

2025-03-26 09:08:00
admin
原创
11
摘要:问题描述:我想知道如何检查一个变量是否是一个类(而不是一个实例!)。我曾尝试使用该函数isinstance(object, class_or_type_or_tuple)来执行此操作,但我不知道类会具有什么类型。例如,在下面的代码中class Foo: pass isinstance(Foo, **...

问题描述:

我想知道如何检查一个变量是否是一个类(而不是一个实例!)。

我曾尝试使用该函数isinstance(object, class_or_type_or_tuple)来执行此操作,但我不知道类会具有什么类型。

例如,在下面的代码中

class Foo:
    pass

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

class我尝试用???替换“ ” ,但我意识到那class是 python 中的一个关键字。


解决方案 1:

甚至更好:使用该inspect.isclass功能。

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

>>> x = X()
>>> isinstance(x, X)
True
>>> inspect.isclass(x)
False

解决方案 2:

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

解决方案 3:

inspect.isclass 可能是最好的解决方案,而且很容易看出它是如何实际实现的

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

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

解决方案 4:

此检查与 Python 2.x 和 Python 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

解决方案 5:

inspect.isclass()Benjamin Peterson 关于这项工作的用法是正确的。但请注意,您可以使用内置函数issubclassClass来测试某个对象是否为特定的Class,因此隐式地为。根据您的用例,这可能更具 Python 风格。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

解决方案 6:

class Foo:被称为旧式类,class X(object):被称为新式类。

检查一下Python 中旧式和新式类有什么区别?建议使用新式。阅读“统一类型和类”

解决方案 7:

最简单的方法是使用inspect.isclass得票最多的答案中发布的方法。

实现细节可以在python2 inspect和python3 inspect中找到。

对于新式类:isinstance(object, type)

对于旧式类:isinstance(object, types.ClassType)

em,对于旧式类,它使用,这里是来自types.pytypes.ClassType的代码:

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

解决方案 8:

嗯,inspect.isclass对我来说不起作用,试试这个

class foo:
    pass

var = foo()

if str(type(var)).split(".")[0] == "<class '__main__":
    print("this is a class")
else:
    print(str(type(var)).split(".")[0])

type(var)所以基本上,<class 'a type'>

例如:<class 'int'
但是,当var是一个类时,它会出现类似<class '__main__.classname'>

因此,我们将字符串拆分成<class '__main__,然后进行比较if,如果字符串完全匹配,那么它就是一个类

在此处输入图片描述

解决方案 9:

如果您使用类装饰器,inspect.isclass()则将不起作用,因为该类由函数包装。相反,inspect.unwrap()请先使用,然后用 进行测试inspect.isclass()

例子:

import functools
import inspect

def class_decorator(cls):
    @functools.wraps(cls)
    def wrapper(*args, **kwargs):
        return cls(*args, **kwargs)
    return wrapper

@class_decorator
class Spam:
    pass

print(inspect.isclass(Spam)) # False
print(type(Spam)) # class 'function'

print(inspect.isclass(inspect.unwrap(Spam))) # True
print(inspect.unwrap(Spam)) # class 'Spam'

解决方案 10:

我发现并成功使用的最简单的解决方案是:

 def isclass(cls):
    return str(type(cls)).startswith("<class") and hasattr(cls, '__weakref__')

解决方案 11:

检查type(X) is type

>>> type(Exception) is type
True

>>> type(3) is type
False

>>> class Dummy: pass
>>> type(Dummy) is type
True

受到S.Lott 的回答的启发。

解决方案 12:

简短的回答是,在 Python 中,类的类型是 type。如果它是一个对象,那么类型将是其他类型。奇怪的是,在玩了一会儿之后,我发现下面就是你所需要的。为什么没有一行代码的内置方法,我不知道。下面的图片是我尝试的所有操作的终端截图,因为我还不能上传图片。我会给你它的要点:

class MyClass:
   def __init__(self, x):
       self.x = x;

myobj = MyClass(2);
myobj.x;#2
isinstance(myobj, MyClass);#True
isinstance(MyClass, MyClass);#False
MyClass == MyClass;#True
isinstance(MyClass, str);#False
type(myobj) == object;#False
type(myobj);#<class '__main__.MyClass'>
myobj.__class__#<class '__main__.MyClass'>
a = 10;
a.__class__#<class 'int'>
MyClass.__class__#<class 'type'>
type(MyClass);#<class 'type'>
def isClass(val): return (type(val) == type);
isClass(MyClass);#True
isClass(None);#False
isClass(10);#False

使用 PYTHON SHELL 上的终端内容图像完成。答案如下:

def isClass(val): return (type(val) == type);

终端图片,但我尝试的内容在上面

解决方案 13:

在某些情况下(取决于您的系统),一个简单的测试是查看您的变量是否具有 module 属性。

if getattr(my_variable,'__module__', None):
    print(my_variable, ".__module__ is ",my_variable.__module__)
else:
    print(my_variable,' has no __module__.')

int、float、dict、list、str 等没有 module

解决方案 14:

这里已经有一些可行的解决方案,但这里还有另一个:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用