类型函数如何确定对象的类型?
问题描述:
当传递一个参数时,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)
答
类型将详细介绍什么是在类属性,这是一个参考到类其中对象是一个实例:
>>> 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