内置关键字类型是python中的函数还是类?
Posted
技术标签:
【中文标题】内置关键字类型是python中的函数还是类?【英文标题】:The built-in keyword type means a function or a class in python? 【发布时间】:2018-04-10 22:32:52 【问题描述】:在大多数帖子中,人们常说type
如果提供一个参数是一个内置函数,如果提供三个参数它是一个元类。
但是在python's doc中,type
的签名是:
class type(object)
class type(name, bases, dict)
那么,这是否意味着type
是一个内置类而不是一个内置函数,即使它提供了一个参数?
【问题讨论】:
嗯,它不能同时是两者——但它在传递一个参数时就像一个函数。 我觉得应该是你的答案:docs.python.org/3/library/stdtypes.html#bltin-type-objectstype
不是关键字。关键字示例为 for
、in
或 as
。您不能将变量命名为 for
,但可以将变量命名为 type
(合法但强烈不推荐!)。
【参考方案1】:
Python 中的类和函数之间的区别不像其他语言那样明显。
您可以使用函数调用语法来调用实际函数,也可以使用 __call__
方法的类的实例,甚至覆盖 __new__
的类也可以像函数一样运行。
Python 用于所有这些的词是 callable:您可以使用调用语法 (foo()
) 调用的对象,它会计算结果。
内置的type
是callable
。可以调用。
有时你把type
当作一个函数,它可以工作,所以你可以说它是一个函数。其他时候你把它当作一堂课,所以你可以说它是一堂课。实际的实现应该无关紧要。
这是正在输入的鸭子:if it walks like a duck, and it quacks like a duck, then it must be a duck。
【讨论】:
无论是否覆盖__new__
,所有类都是可调用的。问题是关于内置的type
。鸭子类型是根据对象的行为而不是继承对对象进行分类的原则。不相关。【参考方案2】:
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
的工作原理,请查看the C code in type_new
。你可以看到(向下滚动几行)type(x)
是一个特例,它立即返回x
的类型(AKA 类)。当您执行type(name, bases, dict)
时,将调用类型创建机制。
如需更多乐趣,请尝试以下方法:
type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))
【讨论】:
【参考方案3】:内置的type
总是返回一个类型对象,基本上就是一个类。无论是单参数形式还是三参数形式都是如此。在单参数的情况下,返回的对象是参数的type(类)。在三个参数的情况下,返回的对象是一个新的类型对象(类)。在这两种情况下,返回的对象都可用于实例化新对象(类的实例)。
有些类可以用作元类。这是type
的三参数形式的常见用例。但是还有其他方法可以制作可以用作元类的类,以及type
的三参数形式的其他用途。
它与int
没有太大区别,int
是一个返回int
类型对象的内置函数。 int
也是一个类的名字,可以用来创建新的对象:
>>> x = int()
>>> x
0
>>> type(x)
<class 'int'>
和类型一样,它有不止一种形式:
>>> y = int("A", 16)
>>> y
10
【讨论】:
以上是关于内置关键字类型是python中的函数还是类?的主要内容,如果未能解决你的问题,请参考以下文章
part2:Python 变量及简单类型,print 函数介绍,Python 关键字内置函数介绍