1

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

4 回答 4

2

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

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

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

于 2013-04-26T11:10:37.133 回答
1

type 将详细说明class属性中的内容,这是对对象是其实例的引用

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

这与元类有关,关于元类是什么以及它们如何工作的一个绝妙答案可以在这里找到什么是 Python Alternativley 中的元类,这是一个非常详尽的Python 类型和对象指南

于 2013-04-26T11:17:04.180 回答
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)
于 2013-04-26T11:16:14.173 回答
0

从文档

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

于 2013-04-26T11:16:18.887 回答