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'>)
答案 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)
每个值都是一个对象,因此有一个类(也称为其类型)。它存储为
object.__class__
。