Python 如何检查对象是否为新型自定义类的实例?
代码: 输出:Python 如何检查对象是否为新型自定义类的实例?,python,python-2.x,new-style-class,Python,Python 2.x,New Style Class,代码: 输出: import types class C(object): pass c = C() print(isinstance(c, types.InstanceType)) 检查对象是否是新样式类的用户定义类的实例的正确方法是什么 UPD: 我想进一步强调检查对象的类型是否是用户定义的。根据文件: 类型。实例类型 用户定义类的实例类型 UPD2: 好吧-不“正确”的方式也可以 UPD3: 还注意到,模块类型中没有集合的类型,我不确定“正确”的方法,但一个简单的测试方法
import types
class C(object):
pass
c = C()
print(isinstance(c, types.InstanceType))
检查对象是否是新样式类的用户定义类的实例的正确方法是什么
UPD:
我想进一步强调检查对象的类型是否是用户定义的。根据文件:
类型。实例类型用户定义类的实例类型 UPD2: 好吧-不“正确”的方式也可以 UPD3: 还注意到,模块
类型中没有集合的类型,我不确定“正确”的方法,但一个简单的测试方法是旧样式类的实例具有“instance”类型,而不是实际的类
所以type(x)是x。uuu class_uu
或type(x)不是类型。InstanceType
应该都能工作
False
也许我可以使用消去法——不显式检查对象是否是用户定义类的实例——isinstance(object,RightTypeAliasForThisCase)
,但检查对象是否不是“基本”类型之一。您可以组合x.\uuu类\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
或hasattr(x,'.'.'.'插槽'.'.'.'.'
,作为区分新/旧样式类和用户/内置对象的一种简单方法
事实上,同样的建议也出现在
这告诉我们如果是真的
>>> 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
第二个参数是要检查的类的元组。
这很容易理解,而且我相信它是有效的。
[编辑(对象)到(对象),谢谢邓肯!]比我快。如果你不介意的话,我会在你的答案中添加链接。实际上type(x)是x.。\uuuu class\uuuu
返回True
,即使x=1
。因此,这种方式与isinstance(x,types.InstanceType)
不同,我还不能编辑您的问题,但@Gill这是因为int
是一个新样式的类。根据您实际编辑的问题,看起来您运气不好。这是一个奇怪的需求,它是用来做什么的?我试图编写一个简单的函数来测量对象作为参数提供的内存量。嗯,我还是不明白。为什么需要知道它是否是用户定义的类?在“是”和“否”不同的情况下,你会怎么做?@NedBatchelder可能是\uuuuu插槽\uuuuu
问题或类似的问题。除了在c库中定义的对象会失败之外。我想术语hackish是合适的。@sbu您通常在C库中创建(即代码)一个类,并在运行python代码时加载它吗?通过用户定义,我简单地认为用户完全使用Python创建它,而不依赖带有C代码的CPython API。我知道这个方法可能会失败,但是对于给定的问题,没有任何其他方法是有效的(你的答案是无效的)。@mmgp似乎这就是答案,谢谢!我将再等4天,并接受/奖励您的答案,如果不少于黑客解决方案将张贴。辉煌。我今天需要它的原因与吉尔三年前需要它的原因完全相同:。当递归地分析用户定义对象所消耗的空间以及这些对象所传递引用的用户定义引用的完整树时,递归自然会在内置对象处触底。这个简单的(尽管有点粗俗)测试拯救了我的加拿大培根。相关地,的最后三行是\u instance\u userdefined\u和\u newclass()。获胜的效率收益微不足道。您的第二个参数只是对象
。括号不会神奇地将其转换为元组:逗号构成元组,因此(object,)
将是一个单元素元组。但是在这种情况下,只传递对象
就可以了,因为issubclass()
的第二个参数可以是类,也可以是issubclass()
作为第二个参数的元组。(是的,定义是递归的,因此可以使用类的嵌套元组。)issubclass(int,(object,)
也返回True
,因此不符合OP的要求。事实上,OP说的是“不“正确”答案,我理解这意味着即使不是正式的方式也可以工作。但我可以看到混乱:否决票被删除。
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
if issubclass(checkthis, (object)) and 'a' not in vars(__builtins__):print"YES!"