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
Run Code Online (Sandbox Code Playgroud)
Fla*_*ien 41
这是一个老问题,但没有一个答案似乎提到这一点.在一般情况下,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()
Run Code Online (Sandbox Code Playgroud)
输出:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
Run Code Online (Sandbox Code Playgroud)
原因是ClassB覆盖了__class__描述符,但是对象中的内部类型字段没有改变.type(instance)直接从该类型字段读取,因此它返回正确的值,而instance.__class__引用新的描述符替换Python提供的原始描述符,后者读取内部类型字段.它不是读取内部类型字段,而是返回硬编码值.
Ale*_*lli 30
老式的课是问题,感叹:
>>> class old: pass
...
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>>
Run Code Online (Sandbox Code Playgroud)
在Python 3中不是问题,因为现在所有的类都是新式的;-).
在Python 2,一类是仅当它从另一个新式类(包括继承的新风格object和各种内置的类型,如dict,list,set,...),或含蓄或明确设置__metaclass__到type.
Mar*_*ddy 14
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
Run Code Online (Sandbox Code Playgroud)
代理对象(使用弱引用)有一个有趣的边缘情况:
>>> import weakref
>>> class MyClass:
... x = 42
...
>>> obj = MyClass()
>>> obj_proxy = weakref.proxy(obj)
>>> obj_proxy.x # proxies attribute lookup to the referenced object
42
>>> type(obj_proxy) # returns type of the proxy
weakproxy
>>> obj_proxy.__class__ # returns type of the referenced object
__main__.MyClass
>>> del obj # breaks the proxy's weak reference
>>> type(obj_proxy) # still works
weakproxy
>>> obj_proxy.__class__ # fails
ReferenceError: weakly-referenced object no longer exists
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7503 次 |
| 最近记录: |