Python检查类的实例

exb*_*ker 64 python object instance

有没有办法检查对象是否是类的实例?不是具体类的实例,而是任何类的实例.

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

Mat*_*ock 77

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"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 这还会检查该对象是否继承自类。例如 `isinstance(MyClass_instance, object) == true`。 (2认同)
  • 看起来 `isinstance(MyClass, type)` 返回 True,而 `isinstance(MyClass(), type)` 返回 False。`isinstance(MyClass, object)` 和 `isinstance(MyClass(), object)` 都返回 True。Isinstance with type 是唯一有效的 (2认同)

Ber*_*Ber 22

你试过isinstance()内置功能吗?

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

  • 据我所知,这个功能检查具体类的实例。我必须将一些类传递给这个函数,例如 `isinstance(obj,FooBar)` 我不能写类似 `isinstance(obj)` (2认同)
  • 到目前为止,`hasattr(obj,'__ class __')`总是适用于我尝试的所有类型的变量.也许`__name__`会更好检查. (2认同)

Roh*_*hit 9

如果要检查用户定义类的对象而不是具体内置类型的实例,则可以检查它是否具有__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
>>> 
Run Code Online (Sandbox Code Playgroud)

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

class A:
    pass
a = A()
isinstance(a, object)
True
isinstance(4, object)
True
isinstance("hello", object)
True
isinstance((1,), object)
True
Run Code Online (Sandbox Code Playgroud)


小智 8

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

def isclass(obj):
    return isinstance(obj, type)
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于非内置 _type_ afaict (2认同)

use*_*863 5

class test(object): pass
type(test)
Run Code Online (Sandbox Code Playgroud)

退货

<type 'type'>

instance = test()
type(instance)
Run Code Online (Sandbox Code Playgroud)

退货

<class '__main__.test'>
Run Code Online (Sandbox Code Playgroud)

因此,这是区分它们的一种方法。

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
Run Code Online (Sandbox Code Playgroud)


ell*_*hee 5

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

is_class = hasattr(obj, '__name__')
Run Code Online (Sandbox Code Playgroud)