内置关键字类型是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-objects type 不是关键字。关键字示例为 forinas。您不能将变量命名为 for,但可以将变量命名为 type(合法但强烈不推荐!)。 【参考方案1】:

Python 中的类和函数之间的区别不像其他语言那样明显。

您可以使用函数调用语法来调用实际函数,也可以使用 __call__ 方法的类的实例,甚至覆盖 __new__ 的类也可以像函数一样运行。

Python 用于所有这些的词是 callable:您可以使用调用语法 (foo()) 调用的对象,它会计算结果。

内置的typecallable。可以调用。

有时你把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 关键字内置函数介绍

python中的关键字---3(内置函数)

python之匿名函数以及在内置函数中的使用

二级Python----Python的内置函数及标准库(DAY 8)

python中的关键字---5(时间/随机模块)

python 关键字和内置函数