代码:
import types
class C(object):
pass
c = C()
print(isinstance(c, types.InstanceType))
输出:
False
检查对象是否为新式类的用户定义类的实例的正确方法是什么?
如果检查对象类型是否为用户定义,我还要强调一下。根据文件:
types.InstanceType
用户定义的类的实例类型。
好吧 - 不是“正确”的方式也可以。
另请注意,模块set
types
的类型
答案 0 :(得分:7)
您可以将x.__class__
检查与'__dict__' in dir(x)
或hasattr(x, '__slots__')
的存在(或不存在)结合起来,作为区分新/旧式类和用户的hacky方式/ builtin object。
实际上,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
答案 1 :(得分:6)
我不确定“正确”的方法,但测试它的一种简单方法是旧样式类的实例具有“实例”类型而不是实际类。
因此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
答案 2 :(得分:1)
这告诉我们是否真实。
if issubclass(checkthis, (object)) and 'a' not in vars(__builtins__):print"YES!"
第二个参数是要检查的类的元组。 这很容易理解,我确信它有效。 [编辑(对象)到(对象),感谢Duncan!]
答案 3 :(得分:0)
可能我可以使用消除方法 - 不检查对象是否是显式的用户定义类的实例 - isinstance(object, RightTypeAliasForThisCase)
,但检查对象是否不是“基本”类型之一。