Python内置函数不是真正的函数,对吧?

时间:2013-08-30 14:01:59

标签: python

只是考虑Python的dict “函数”并开始意识到dict根本不是一个函数。例如,如果我们执行dir(dict),我们会得到各种方法,这些方法不包含在用户定义函数的通常命名空间中。扩展该思想,类似于dir(list)dir(len)。它们不起作用,但真的是type。但后来我对文档页面http://docs.python.org/2/library/functions.html感到困惑,它明确地说明了函数。 (我想它应该只是说内置的callables)

那是什么给出的? (开始看起来对类和函数进行区分是微不足道的)

4 个答案:

答案 0 :(得分:5)

一般来说,这是一个可调用的类。调用dict()实际上是调用dict构造函数。就像你定义自己的类(例如C)并调用C()来实例化它一样。

答案 1 :(得分:3)

dict相比,sum特殊的一种方式是,虽然两者都是callable,但两者都是用C实现的(无论如何都是在cpython中),{ {1}}是dict;也就是type。这意味着您可以使用isinstance(dict, type) == True作为其他类型的基类,您可以编写:

dict

但不是

class MyDictSubclass(dict):
    pass

这对于使类似行为类似于内置对象但具有一些增强功能的类非常有用。例如,您可以定义一个class MySumSubclass(sum): pass 的子类,它将tuple实现为向量加法而不是连接:

+

这引出了另一个有趣的观点。 class Vector(tuple): def __add__(self, other): return Vector(x + y for x, y in zip(self, other)) 也在C中实现。它也可以调用。与type一样(与dict不同),它是sum的一个实例; type。由于这个奇怪的,看似不可能的循环,isinstance(type, type) == True可用于创建新的类类(称为元类)。你可以写:

type

或者,在Python 3中:

class MyTypeSubclass(type):
    pass

class MyClass(object):
    __metaclass__ = MyTypeSubclass

这给出了class MyClass(metaclass=MyTypeSubclass): pass 的有趣结果。但这有用的方法有点超出了这个答案的范围。

答案 2 :(得分:1)

dict()dict实例的构造函数。当您执行dir(dict)时,您正在查看类dict的属性。当您撰写a = dict()时,您将a设置为dict类型的新实例。

我在这里假设dict()是你所指的“dict函数”。或者您正在调用dict的索引实例,例如a['my_key']一个函数?

答案 3 :(得分:0)

请注意,在构造函数dir

上调用dict.__init__
dir(dict.__init__)

为您提供您所期望的内容,包括与您获得的任何其他功能相同的内容。由于对dict()构造函数的调用导致调用dict.__init__(instance),因此解释了这些函数属性的去向。 (当然在任何构造函数中都有一些额外的幕后工作,但对于任何对象而言,这与dicts相同。)