有没有办法检查对象是否是类的实例?不是具体类的实例,而是任何类的实例。
我可以检查一个对象不是类、不是模块、不是回溯等等,但我对一个简单的解决方案感兴趣。
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"
isinstance(MyClass_instance, object) == true
。 - cowlinatorisinstance(MyClass, type)
返回 True,而 isinstance(MyClass(), type)
返回 False。isinstance(MyClass, object)
和 isinstance(MyClass(), object)
都返回 True。使用 type 的 isinstance 是唯一有效的方法。 - FoolishProteinlong
已被重命名为int
。 https://dev59.com/XGUp5IYBdhLWcg3w-LUJ#14904834 - JayRizzonumpy.datetime64
对象? - Patrick_Chong你尝试过使用内置函数isinstance()
吗?
你还可以查看hasattr(obj, '__class__')
,以查看对象是否是从某个类类型实例化的。
isinstance(obj, FooBar)
,我不能写像 isinstance(obj)
这样的东西。 - exbluesbreakerisinstance(obj, object)
或者其他适合的类在我们的层次结构中,你有什么想法吗?正如其他人所指出的那样,在Python中,包括数字、回溯、异常等所有东西都是某个类的实例。 - Berhasattr(obj, '__class__')
这一条件。也许更好的检查方式是使用 __name__
。 - Youda008如果您想检查一个对象是否是用户自定义类的实例而不是内置类型的实例,您可以检查它是否具有__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
>>>
如果您想检查一个实例是否是任何类(无论是用户定义的还是具体的),您可以简单地检查它是否是 Python 中的最终基类object
的实例。
class A:
pass
a = A()
isinstance(a, object)
True
isinstance(4, object)
True
isinstance("hello", object)
True
isinstance((1,), object)
True
def q(): return 1
,大多数人会认为它是一个函数,而不是一个类。 - Mark Morettodef isclass(obj):
return isinstance(obj, type)
我迟到了。无论如何,我认为这应该可行。
is_class = hasattr(obj, '__name__')
__name__
属性,但函数有。 - Youda008class 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
import inspect
inspect.isclass(myclass)
hasattr(obj, '__dict__')
或obj is not callable(obj)
。最初的回答。if str(type(this_object)) == "<type 'instance'>":
print "yes it is"
else:
print "no it isn't"
class MyClass(object)
不会返回"<type 'instance'>"
而是"<class 'MyClass'>"
,因此您必须将s.startswith("<class ")
添加到条件中。 - Youda008很难确定你需要什么,但也许inspect.isclass(val)
是你正在寻找的内容?
from MyModule import MyClass
和a = MyClass()
之后,inspect.isclass(MyClass)
返回True
,但inspect.isclass(a)
返回False
。 - exbluesbreaker
from my_module import MyClass
,将会得到类对象,而不是类的实例对象;类似地,对于traceback、函数和模块也是如此。inspect
模块包含用于检查这些类型对象的特殊函数,但没有针对类的实例对象的函数。大致上,我想要检测所有对象,对于这些对象print obj
将会打印<instance of ...>
(如果没有为该类定义特殊的打印形式)。 - exbluesbreakertype
,但任何人都可以定义元类,即使不继承自type
)。回溯(traceback)只是traceback
的一个实例。函数只是function
的一个实例。方法也只是一个类的实例(这取决于你对方法的确切理解)。你需要更具体的说明——或者更好的办法是,告诉我们您的实际问题。 - user395760