内置关键字类型是指python中的函数还是类?

时间:2017-10-30 01:09:59

标签: python types metaclass

在大多数帖子中,人们常说type是一个内置函数,如果它有一个参数,如果提供了3个参数,它就是一个元类。

但在python's doc中,type的签名是:

class type(object)
class type(name, bases, dict)

那么,这是否意味着type是一个内置类而不是内置函数,即使它提供了一个参数?

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

内置type始终返回类型对象,它基本上是一个类。无论是单参数形式还是三参数形式,都是如此。在单参数情况下,返回的对象是参数的类型(类)。在三参数的情况下,返回的对象是一个新的类型对象(类)。在这两种情况下,返回的对象都可用于实例化新对象(类的实例)。

某些类可以用作元类。这是type的三参数形式的常见用例。但是还有其他方法可以创建一个可以用作元类的类,以及用于type的三参数形式的其他用法。

int没有多大区别,int是一个返回类型为int的对象的内置函数。 >>> x = int() >>> x 0 >>> type(x) <class 'int'> 也是类的名称,可用于创建新对象:

>>> y = int("A", 16)
>>> y
10

还有类型,它有多种形式:

if list == animal {

答案 2 :(得分:0)

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