109

有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。

我可以检查一个对象不是类、不是模块、不是回溯等,但我对一个简单的解决方案感兴趣。

4

12 回答 12

125

isinstance()是你的朋友吗?它返回一个布尔值,可以通过以下方式检查类型。

if isinstance(obj, (int, long, float, complex)):
    print obj, "is a built-in number type"

if isinstance(obj, MyClass):
    print obj, "is of type MyClass"

希望这可以帮助。

于 2013-01-27T20:21:32.207 回答
30

您是否尝试过isinstance()内置功能?

您还可以hasattr(obj, '__class__')查看该对象是否是从某个类类型实例化的。

于 2013-01-27T16:27:58.443 回答
10

如果要检查用户定义类的对象而不是具体内置类型的实例,可以检查它是否具有__dict__属性。

>>> class A:
...     pass
... 
>>> obj = A()
>>> hasattr(obj, '__dict__')
True
>>> hasattr((1,2), '__dict__')
False
>>> hasattr(['a', 'b', 1], '__dict__')
False
>>> hasattr({'a':1, 'b':2}, '__dict__')
False
>>> hasattr({'a', 'b'}, '__dict__')
False
>>> hasattr(2, '__dict__')
False
>>> hasattr('hello', '__dict__')
False
>>> hasattr(2.5, '__dict__')
False
>>> 

如果您有兴趣检查一个实例是否是任何类的对象,无论是用户定义的还是具体的,您可以简单地检查它是否是objectPython 中最终基类的实例。

class A:
    pass
a = A()
isinstance(a, object)
True
isinstance(4, object)
True
isinstance("hello", object)
True
isinstance((1,), object)
True
于 2018-10-03T10:10:37.087 回答
8

我有一个类似的问题,结果证明对我有用:

def isclass(obj):
    return isinstance(obj, type)
于 2018-06-19T11:39:02.190 回答
6

我迟到了。无论如何认为这应该工作。

is_class = hasattr(obj, '__name__')
于 2014-03-17T10:12:05.397 回答
5
class test(object): pass
type(test)

返回

<type 'type'>

instance = test()
type(instance)

返回

<class '__main__.test'>

所以这是区分它们的一种方法。

def is_instance(obj):
    import inspect, types
    if not hasattr(obj, '__dict__'):
        return False
    if inspect.isroutine(obj): 
        return False
    if type(obj) == types.TypeType: # alternatively inspect.isclass(obj)
        # class type
        return False
    else:
        return True
于 2013-08-30T16:24:27.280 回答
3

或者

import inspect
inspect.isclass(myclass)
于 2014-08-19T09:32:15.963 回答
2

很难说出你想要什么,但也许inspect.isclass(val)是你正在寻找的?

于 2013-01-27T17:15:19.380 回答
2

这是一个肮脏的把戏。

if str(type(this_object)) == "<type 'instance'>":
    print "yes it is"
else:
    print "no it isn't"
于 2014-12-09T04:07:07.960 回答
2

是的。因此,您可以使用hasattr(obj, '__dict__')obj is not callable(obj)

于 2019-04-21T12:38:51.700 回答
1

有什么方法可以检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。

我可以检查一个对象不是类、不是模块、不是回溯等,但我对一个简单的解决方案感兴趣。

一种方法,就像您在问题中描述的那样,是一个排除过程,检查它是否不是您想要的。我们检查它是类、模块、回溯、异常还是函数。如果是,那么它不是类实例。否则,我们会返回 True,这在某些情况下可能很有用,而且我们会在此过程中建立一个小助手库。

这是一些代码,它定义了一组类型检查器,然后将它们全部组合起来以排除我们不关心这个问题的各种事情。

from types import (
    BuiltinFunctionType,
    BuiltinMethodType,
    FunctionType,
    MethodType,
    LambdaType,
    ModuleType,
    TracebackType,
)
from functools import partial
from toolz import curry
import inspect
    
def isfunction(variable: any) -> bool:
    return isinstance(
        variable,
        (
            BuiltinFunctionType,
            BuiltinMethodType,
            FunctionType,
            MethodType,
            LambdaType,
            partial,
            curry
        ),
    )
    
isclass = inspect.isclass
    
def ismodule(variable: any) -> bool:
   return isinstance(variable, ModuleType)
    
    
def isexception(variable: any) -> bool:
    return isinstance(variable, Exception)
    
    
def istraceback(variable: any) -> bool:
    return isinstance(variable, TracebackType)
    
    
def isclassinstance(x: any) -> bool:
    if isfunction(x) or isclass(x) or ismodule(x) or istraceback(x) or isexception(x):
        return False
    return True

请记住,从抽象的角度来看,一切都是事物,甚至是事物或功能的类别......但从实际的角度来看,这有助于避免将 MyClass 误认为 my_class_instance (python 社区也使用 PascalCase 和蛇形案例非正式地做到这一点)

我们可以改进这一点

于 2020-07-17T06:10:36.847 回答
0

最近不得不处理类似的事情。

import inspect

class A:
    pass

def func():
    pass

instance_a = A()

def is_object(obj):
     return inspect.isclass(type(obj)) and not type(obj) == type

is_object(A)          # False
is_object(func)       # False
is_object(instance_a) # True
于 2015-10-25T04:00:23.037 回答