type被称为“元类”,因为它是一个生成其他类(又称类型)的类。它的行为与普通类类似。特别是,它有一个__new__方法的等价物,在Python中类似于:class type(object):
def __new__(cls, *args):
num_args = len(args)
if num_args not in (1, 3):
raise TypeError('type() takes 1 or 3 arguments')
# type(x)
if num_args == 1:
return args[0].__class__
# type(name, bases, dict)
name, bases, attributes = args
bases = bases or (object,)
class Type(*bases):
pass
Type.__name__ = name
qualpath = Type.__qualname__.rsplit('.', 1)[0]
Type.__qualname__ = '.'.join((qualpath, name))
for name, value in attributes.items():
setattr(Type, name, value)
return Type
Class = type('Class', (), {'i': 1})
instance = Class()
print(type(instance)) # -> Class
print(instance.__class__) # -> Class
print(type(type(instance))) # -> type
print(Class.i) # -> 1
print(instance.i) # -> 1
请注意,当实例化一个类时,新实例的值是从^{}返回的值。在type的情况下,__new__总是返回一个类型对象(AKA class)。下面是一个扩展int以使用-1而不是{}作为默认值的类的示例:
^{pr2}$
要真正深入研究type的工作原理,请看一下the C code in ^{}。您可以看到(向下滚动几行)是一个特殊情况,它立即返回x的类型(也称为类)。当您执行type(name, bases, dict)操作时,将调用类型创建机制。在
要获得更多乐趣,请尝试以下操作:type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))