类型函数如何确定对象的类型?

问题描述:

当传递一个参数时,type函数如何确定它传递的对象的类型?类型函数如何确定对象的类型?

是否可以通过对对象的class定义进行一些特定更改来定制它的返回值?

编辑:

我怀疑它采用了object.__class__属性,因为尽管覆盖类的__getattribute__功能查询__class__时返回一些任意值,它返回的实际类型时类型通过type检查的。

>>> class Foo(object): 
...  def __getattribute__(self, name): 
...   if name == "__class__": 
...    return type("Bar",(), {}) 
...   else: 
...    return super(Foo, self).__getattribute__(name) 
... 
>>> bar = Foo() 
>>> bar.__class__ , type(bar) 
(<class '__main__.Bar'>, <class '__main__.Foo'>) 

这是一个实现细节,但我会假设它通过检查值的内部表示中的一些数据来做到这一点。

毕竟,Python系统必须能够确定每个值的类型,以便弄清楚如何对它们执行操作。

The documentation没有提及任何修改或影响type()内置函数返回的值的方法,所以我认为你不能这样做。

类实例有一个叫做__class__的特殊属性。

In [1]: class A: 
    ...:  pass 
    ...: 

In [2]: class B: 
    ...:  pass 
    ...: 

In [3]: a = A() 

In [4]: type(a), a.__class__ 
Out[4]: (__main__.A, __main__.A) 

In [5]: a.__class__ = B 

In [6]: type(a), a.__class__ 
Out[6]: (__main__.B, __main__.B) 

在Python 2.x中,您需要新样式的类来查看此输出。否则:

In [4]: type(a), a.__class__ 
Out[4]: (instance, __main__.A) 

In [5]: a.__class__ = B 

In [6]: type(a), a.__class__ 
Out[6]: (instance, __main__.B) 

From the docs

每个值是一个对象,并且因此具有类(也称为其类型)。它被存储为object.__class__

类型将详细介绍什么是在属性,这是一个参考其中对象是一个实例:

>>> num = 5 
>>> num.__class__ 
<class 'int'> 
>>> type(num) 
<class 'int'> 
>>> type(type(num)) 
<class 'type'> 

这与元类有关,metaclasses是一个明智的答案这些是他们如何工作可以在这里找到What is a metaclass in Python Alternativley,这是指导是非常彻底的Python types and Objects