如何检查对象是否是新式用户定义类的实例?
代码:
import types
class C(object):
pass
c = C()
print(isinstance(c, types.InstanceType))
输出:
False
怎么正确检查一个对象是否是用户自定义类的实例,特别是对于新式类?
更新:
我想特别强调一下,检查对象的类型是否是用户自定义类。根据文档:
types.InstanceType
用户自定义类的实例类型。
更新2:
好吧,"不正确"的方法也可以。
更新3:
还注意到在types
模块中没有set
的类型。
4 个回答
1
这段话的意思是,如果条件成立,就会返回“真”。
if issubclass(checkthis, (object)) and 'a' not in vars(__builtins__):print"YES!"
第二个参数是一个元组,里面包含了要检查的类。这个很容易理解,我相信它是有效的。
[编辑:把(object)改成(object,),谢谢Duncan!]
7
我不太确定“正确”的方法是什么,但有一种简单的测试方式,就是老式类的实例类型是'instance',而不是它们实际的类。
所以你可以用 type(x) is x.__class__
或者 type(x) is not types.InstanceType
来检查,这两种方法都可以。
>>> class Old:
... pass
...
>>> class New(object):
... pass
...
>>> x = Old()
>>> y = New()
>>> type(x) is x.__class__
False
>>> type(y) is y.__class__
True
>>> type(x) is types.InstanceType
True
>>> type(y) is types.InstanceType
False
9
你可以把 x.__class__
的检查和 '__dict__' in dir(x)
或 hasattr(x, '__slots__')
的存在结合起来,这是一种比较“hacky”的方法,用来区分新旧风格的类和用户自定义对象与内置对象。
其实,这个建议在 https://stackoverflow.com/a/2654806/1832154 上也有提到过。
def is_instance_userdefined_and_newclass(inst):
cls = inst.__class__
if hasattr(cls, '__class__'):
return ('__dict__' in dir(cls) or hasattr(cls, '__slots__'))
return False
>>> class A: pass
...
>>> class B(object): pass
...
>>> a = A()
>>> b = B()
>>> is_instance_userdefined_and_newclass(1)
False
>>> is_instance_userdefined_and_newclass(a)
False
>>> is_instance_userdefined_and_newclass(b)
True