types(obj)和obj .__ class__之间的区别
type(obj)
和obj.__class__
什么区别? 是否有type(obj) is not obj.__class__
的可能性?
我想写一个函数,一般在提供的对象上工作,使用与另一个参数相同types的默认值1。 下面的#1或#2哪个变化会做正确的事情?
def f(a, b=None): if b is None: b = type(a)(1) # #1 b = a.__class__(1) # #2
type(obj)
和type.__class__
对于旧的类风格不相同:
>>> class a(object): ... pass ... >>> class b(a): ... pass ... >>> class c: ... pass ... >>> ai=a() >>> bi=b() >>> ci=c() >>> type(ai) is ai.__class__ True >>> type(bi) is bi.__class__ True >>> type(ci) is ci.__class__ False
老式的课是这个问题,感叹:
>>> class old: pass ... >>> x=old() >>> type(x) <type 'instance'> >>> x.__class__ <class __main__.old at 0x6a150> >>>
Python 3中没有问题,因为现在所有的类都是新式的;-)。
在Python 2中,只有从另一个新样式类(包括object
和各种内置types,如dict
, list
, set
,…) __metaclass__
,或者隐式或显式地将__metaclass__
设置为type
。
这是一个古老的问题,但似乎没有一个答案提到这一点。 在一般情况下,新样式类可能具有不同的type(instance)
和instance.__class__
:
class ClassA(object): def display(self): print("ClassA") class ClassB(object): __class__ = ClassA def display(self): print("ClassB") instance = ClassB() print(type(instance)) print(instance.__class__) instance.display()
输出:
<class '__main__.ClassB'> <class '__main__.ClassA'> ClassB
原因是ClassB
覆盖了__class__
描述符,但是对象中的内部types字段没有改变。 type(instance)
直接从该types字段中读取,所以它返回正确的值,而instance.__class__
引用新的描述符replacePython提供的原始描述符,它读取内部types字段。 它不是读取内部types字段,而是返回硬编码值。