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,如dictlistset ,…) __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字段,而是返回硬编码值。

Interesting Posts