内置关键字类型是指python中的函数还是类?
问题内容:
在大多数帖子中,人们经常说type
如果提供一个参数则是一个内置函数,如果提供三个参数则是一个元类。
但是在python的doc中,的签名type
是:
class type(object)
class type(name, bases, dict)
因此,这意味着type
是内置类而不是内置函数,即使它提供了一个参数也是如此吗?
问题答案:
type
之所以称为“元类”,是因为它是产生其他类(AKA类型)的类。它的行为就像普通的类。特别是,它等效__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
请注意,在实例化一个类时,新实例的值是从返回的值__new__
。对于type
,__new__
始终返回类型对象(AKA类)。这是一个扩展int
为-1
用作默认值而不是的类的示例0
:
def Int__new__(cls, *args):
if not args:
return cls(-1)
return super(cls, cls).__new__(cls, *args)
Int = type('Int', (int,), {'__new__': Int__new__})
i = Int()
print(type(i)) # -> Int
print(i.__class__) # -> Int
print(type(type(i))) # -> type
print(i) # -> -1
j = Int(1)
print(j) # -> 1
要真正了解其type
工作原理,请看中的C代码type_new
。您可以看到(向下滚动几行)这type(x)
是一种特殊情况,可以立即返回类型(AKA类)x
。完成后type(name, bases, dict)
,将调用类型创建机制。
要获得更多乐趣,请尝试以下操作:
type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))