Python有内置函数type。
类
type(对象) 使用一个参数,返回对象的类型。返回值是一个类型对象,通常与object.__class__返回的对象相同。
Python还有一个特殊的属性__class__。
例如.
__class__类实例所属的类。
我曾经相信他们都是指同一个对象。但是,在方法abc.ABCMeta.__instancecheck__中,需要检查它们是否相同:
def __instancecheck__(cls, instance):
"""Override for isinstance(instance, cls)."""
# Inline the cache checking
subclass = instance.__class__
# […]
subtype = type(instance)
if subtype is subclass:
# […]type(instance)和instance.__class__什么时候不同?
发布于 2017-02-22 07:52:26
旧式对象(从无继承)就是这种情况。这些对象没有__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的给定行,所以它看起来确实是一个兼容性问题,或者他们只是忘记了它。
https://stackoverflow.com/questions/42384991
复制相似问题