类型(OBJ)和OBJ .__ class__之间差
-
21-08-2019 - |
题
是什么type(obj)
和obj.__class__
之间的差异?是否有过type(obj) is not obj.__class__
的可能性?
我想要写的作品一般对所提供的目的,在相同类型的另一参数使用的默认值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
其他提示
这是一个老问题,但没有一个答案,似乎一提的是。在一般情况下,它的 IS 强>可能的是新式类具有用于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__
描述符,但是在对象内部类型字段不改变。 type(instance)
从类型字段直接读取,所以它返回正确的值,而instance.__class__
指新的描述符替换由Python,它读取内部类型字段中提供的原始描述符。代替的读取内部类型字段,它返回一个硬编码值。
旧式类是问题,感叹:
>>> class old: pass
...
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>>
在Python 3不是一个问题,因为所有的类现在新型;。 - )
在Python 2中,一类是仅当它从另一个新的风格类继承新的风格(包括object
和各种内置的类型,如dict
,list
,set
,...)或隐式或显式地设定__metaclass__
到type
。
不隶属于 StackOverflow