2017-02-22 122 views
6

Python具有内置函数type,每个实例也具有__class__属性。我一般认为他们回来了同样的事情。即使两者的文件听起来相似:什么时候是类型(实例)而不是实例.__ class__?

instance.__class__

的类,其中一类实例所属。

type(object)

带一个参数,返回对象的类型。

然而在abc.ABCMeta.__instancecheck__有一个检查它们是否相同(略微缩短):

subclass = instance.__class__ 
subtype = type(instance) 
if subtype is subclass: 

当将不是这种情况?什么时候是type(instance)instance.__class__不一样?

+0

可能的重复http://stackoverflow.com/questions/9610993/python-type-or-class-or-is – Kasramvd

+0

@Kasramvd感谢您的链接,我相信它可能是http:// stackoverflow的重复。 COM /问题/ 1060499 /差间typeobj-和对象类。我不确定为什么他们在提问时没有出现,在提出问题时也没有出现在“提出的重复内容”中。 – MSeifert

+0

是的,有时候会发生这种情况;) – Kasramvd

回答

2

这是旧样式对象(从无从继承)的情况。这些对象不具有__class__属性。我认为他们这样做是为了防止错误。用于Python 2.7实施例:

class A: 
    pass 

class B(object): 
    pass 

a = A() 
b = B() 

print(dir(a)) # ['__doc__', '__module__'] 
print(dir(b)) # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

print(b.__class__) # <class '__main__.B'> 
print(type(b))  # <class '__main__.B'> 

##################### 
# The intersting part 
print(a.__class__) # __main__.A 
print(type(a))  # <type 'instance'> 


print(B.__class__) # <type 'type'> 
print(type(B))  # <type 'type'> 

print(type(A))  # <type 'classobj'> 
#print(A.__class__) # AttributeError: class A has no attribute '__class__' 

进一步信息请参阅本:

注:从CPython的给定的行被改变在2008上一次(commit),所以它似乎确实是一个兼容性的东西,或者他们只是忘了它。

+0

虽然这是有道理的 - 我正在考虑(忘记提及,明确地)关于Python 3.x,并且没有旧风格的类了。 – MSeifert

+0

@MSeifert上一次在2008年更改了cpython的给定行(https://github.com/python/cpython/commit/68f5fbe94488b671ee6dfae74d918cc6a8eeca56),所以它似乎是兼容性的东西,或者他们只是忘记了它。 – ppasler

+0

@MSeifert我已经更新了我的答案。 – ppasler

相关问题