说我有一个自定义类:
class MyClass():
pass
我想测试这是否是MyClass的一个实例。这可以在没有转换成字符串的丑陋混乱的情况下完成吗?
str(type(MyClass())) == "<class '__main__.MyClass'>"
答案 0 :(得分:4)
这可以在没有转换成字符串的丑陋混乱的情况下完成吗?
是。使用内置函数isinstance
。来自文档:
如果object参数是classinfo参数的实例,或者是(直接,间接或虚拟)子类的实例,则返回true。如果object不是给定类型的对象,则该函数始终返回false。
>>> class MyClass():
... pass
...
>>> isinstance(MyClass(), MyClass)
True
您也可以使用type
这样做:
>>> type(MyClass) == type(MyClass)
True
但不建议这样做,因为type
无法考虑子类。 From the documentation for type
:
建议使用
isinstance()
内置函数来测试对象的类型,因为它需要考虑子类。
答案 1 :(得分:0)
在实例上使用__class__.__name__
,如下所示:
>>> class MyClass():
... pass
...
>>> i = MyClass()
>>> i.__class__.__name__
'MyClass'
或者,isinstance
如果您有权访问父类:
>>> isinstance(i, MyClass)
True
由于类的任何对象也是任何父类的实例,isinstance
也将为所有父类返回True
:
>>> class MyOtherClass(MyClass):
... pass
...
>>> q = MyOtherClass()
>>> isinstance(q, MyClass)
True
>>> isinstance(q, MyOtherClass)
True
>>> isinstance(q, object)
True
然而:
>>> q.__class__.__name__
'MyOtherClass'