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

时间:2013-04-26 11:07:37

标签: python types

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'>)

4 个答案:

答案 0 :(得分:2)

这是一个实现细节,但我认为它是通过检查值的内部表示中的一些数据来实现的。

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

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

答案 1 :(得分:1)

类型会详细说明属性中的内容,这是 引用 其中的对象是的 实例:

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

这与元类有关,对于元类是什么以及它们如何工作的精彩答案可以在这里找到What is a metaclass in Python Alternativley,这是非常透彻的指南Python types and Objects

答案 2 :(得分:0)

类实例有一个名为__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)

答案 3 :(得分:0)

From the docs

  

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