Python检查类的实例


73

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

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


5
每个python对象都是某个类的实例(内置或其他)。
StoryTeller-Unslander Monica

2
因此解决方案是函数def isobject(x):return True
Emanuele Paolini

如果我写的from my_module import MyClass将是类对象,而不是类的实例,则类似地用于回溯,函数,模块。inspect模块包含针对此类对象的特殊检查功能,但不包含针对类实例的功能。大概来说,我想检测所有print obj要打印的对象<instance of ...>(如果没有为类定义特殊的打印)
exbluesbreaker 2013年

一个类只是另一个类的实例(当区分很重要时称为元类;通常,type但是任何人都可以定义一个元类,即使没有继承自,也可以定义IIRC type)。追溯只是的一个实例traceback。函数只是的一个实例function。方法也只是类的实例(这取决于您对方法的确切理解)。您必须更加具体-甚至更好,只需告诉我们您的实际问题

Answers:


90

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"

希望这可以帮助。


您将必须列出所有内置类型,并检查是否所有内置类型,他说他不想要
Youda008

这还将检查对象是否从类继承。例如isinstance(MyClass_instance, object) == true
Cowlinator'5

看起来像isinstance(MyClass, type)返回True,而isinstance(MyClass(), type)返回False。双方isinstance(MyClass, object)isinstance(MyClass(), object)返回True。具有类型的Isinstance似乎是唯一可行的方法
GodSaveTheDoge

25

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

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


1
就我所知,此功能检查具体类的实例。我必须将一些类传递给该函数,例如,isinstance(obj,FooBar)我不能写类似的东西isinstance(obj)
exbluesbreaker 2013年

@exbluesbreakerisinstance(obj, object)在我们的层次结构中又是什么呢?正如其他人ponted我们,一切都在Python是一些类,包括数字,回溯,异常等的实例
误码率

2
到目前为止hasattr(obj, '__class__'),我尝试过的所有类型的变量始终都是正确的。也许__name__最好检查一下。
Youda008'9

6

我遇到了类似的问题,结果对我有用:

def isclass(obj):
    return isinstance(obj, type)

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

5

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

is_class = hasattr(obj, '__name__')

1
不幸的是,事实并非如此。我有Python 2.7.6,定义的类的实例没有__name__,但函数有。
Youda008'9

4

我想我在这件事上很晚了,事实上却在同一个问题上挣扎。所以这对我有用。

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

我在python 3和2.7上都对此进行了测试。


2

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


1

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


1
据我所知,这一检查,如果val是类对象(不是类的实例),例如afterfrom MyModule import MyClassa = MyClass() inspect.isclass(MyClass)return True,但inspect.isclass(a)返回False
exbluesbreaker


1

这是一个肮脏的把戏。

if str(type(this_object)) == "<type 'instance'>":
    print "yes it is"
else:
    print "no it isn't"

从'object'派生的类class MyClass(object)不会返回"<type 'instance'>"but "<class 'MyClass'>",因此您必须添加s.startswith("<class ")条件。
Youda008'9

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 vs snake_case非正式地做到了这一点) )

我们可以改善这个


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

2
在我的Python(2.7.12)中,inspect.isclass(type(a))无论返回什么,总是返回true,这也是您的函数is_object
Youda008'9

@ Youda008,你是对的。此代码有缺陷。棘手的问题。
Ben Hoff
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.