内置关键字类型是指函数还是python中的class?
The built-in keyword type means a function or a class in python?
在大多数帖子中,人们常说type
如果提供一个参数就是一个内置函数,如果提供三个参数就是一个metaclass。
但是在python's doc中,type
的签名是:
class type(object)
class type(name, bases, dict)
那么,这是否意味着 type
是内置的 class 而不是内置函数,即使它提供了一个参数?
classes 和 Python 中的函数之间的区别并不像其他语言中那样明显。
您可以使用函数调用语法来调用实际函数,也可以使用 __call__
方法调用 class 的实例,甚至是覆盖 [=11] 的 class =] 可以表现得像一个函数。
Python 用于所有这些的词是 callable:您可以使用调用语法 (foo()
) 调用的对象,其计算结果为结果。
type
内置的是 callable
。可以调用。
有时您将 type
视为一个函数,它起作用了,所以您可以说它是一个函数。其他时候你把它当作 class,所以你可以说它是 class。实际实施应该无关紧要。
这是鸭子打字动作:if it walks like a duck, and it quacks like a duck, then it must be a duck。
type
被称为 "metaclass" 因为它是一个 class 产生其他 classes(AKA 类型)。它的行为就像一个正常的 class。特别是,它有一个 __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
请注意,在实例化 class 时,新实例的值是从 __new__
返回的值。在 type
的情况下,__new__
总是 returns 类型对象(又名 class)。这是一个扩展 int
以使用 -1
作为默认值而不是 0
的 class 示例:
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
的工作原理,请查看 the C code in type_new
。你可以在那里看到(向下滚动几行)type(x)
是一个特例,它立即 returns x
的类型(又名 class)。当您执行 type(name, bases, dict)
时,将调用类型创建机制。
要获得更多乐趣,请尝试以下操作:
type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))
内置的type
总是returns一个类型的对象,基本上就是一个class。无论是单参数形式还是三参数形式,都是如此。在单参数情况下,返回的对象是参数的 type (class)。在三个参数的情况下,返回的对象是一个新的 类型对象 (class)。在这两种情况下,返回的对象都可用于实例化新对象(class 的实例)。
一些 classes 可以用作 metaclasses。这是 type
的三参数形式的常见用例。但是还有其他方法可以使 class 可以用作元 class,以及 type
.
的三参数形式的其他用途
它与int
没有太大区别,后者是returns类型int
对象的内置函数。 int
也是一个class的名字,可以用来创建新对象:
>>> x = int()
>>> x
0
>>> type(x)
<class 'int'>
而且和type一样,它有不止一种形式:
>>> y = int("A", 16)
>>> y
10
在大多数帖子中,人们常说type
如果提供一个参数就是一个内置函数,如果提供三个参数就是一个metaclass。
但是在python's doc中,type
的签名是:
class type(object)
class type(name, bases, dict)
那么,这是否意味着 type
是内置的 class 而不是内置函数,即使它提供了一个参数?
classes 和 Python 中的函数之间的区别并不像其他语言中那样明显。
您可以使用函数调用语法来调用实际函数,也可以使用 __call__
方法调用 class 的实例,甚至是覆盖 [=11] 的 class =] 可以表现得像一个函数。
Python 用于所有这些的词是 callable:您可以使用调用语法 (foo()
) 调用的对象,其计算结果为结果。
type
内置的是 callable
。可以调用。
有时您将 type
视为一个函数,它起作用了,所以您可以说它是一个函数。其他时候你把它当作 class,所以你可以说它是 class。实际实施应该无关紧要。
这是鸭子打字动作:if it walks like a duck, and it quacks like a duck, then it must be a duck。
type
被称为 "metaclass" 因为它是一个 class 产生其他 classes(AKA 类型)。它的行为就像一个正常的 class。特别是,它有一个 __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
请注意,在实例化 class 时,新实例的值是从 __new__
返回的值。在 type
的情况下,__new__
总是 returns 类型对象(又名 class)。这是一个扩展 int
以使用 -1
作为默认值而不是 0
的 class 示例:
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
的工作原理,请查看 the C code in type_new
。你可以在那里看到(向下滚动几行)type(x)
是一个特例,它立即 returns x
的类型(又名 class)。当您执行 type(name, bases, dict)
时,将调用类型创建机制。
要获得更多乐趣,请尝试以下操作:
type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))
内置的type
总是returns一个类型的对象,基本上就是一个class。无论是单参数形式还是三参数形式,都是如此。在单参数情况下,返回的对象是参数的 type (class)。在三个参数的情况下,返回的对象是一个新的 类型对象 (class)。在这两种情况下,返回的对象都可用于实例化新对象(class 的实例)。
一些 classes 可以用作 metaclasses。这是 type
的三参数形式的常见用例。但是还有其他方法可以使 class 可以用作元 class,以及 type
.
它与int
没有太大区别,后者是returns类型int
对象的内置函数。 int
也是一个class的名字,可以用来创建新对象:
>>> x = int()
>>> x
0
>>> type(x)
<class 'int'>
而且和type一样,它有不止一种形式:
>>> y = int("A", 16)
>>> y
10