9

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

那么给了什么?(开始似乎区分类和函数是微不足道的)

4

4 回答 4

5

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

于 2013-08-30T14:04:02.203 回答
3

dict与 相比,一种特殊的方式sum是,虽然两者都是callable,并且两者都是用 C 实现的(无论如何都是在 cpython 中),但dict它是 a 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))

这带来了另一个有趣的观点。 type也在 C 中实现。它也是可调用的。喜欢dict(和不同)它是;sum的一个实例 . 由于这个奇怪的、看似不可能的循环,可以用来制作新的类(称为元类)。你可以写:typeisinstance(type, type) == Truetype

class MyTypeSubclass(type):
    pass

class MyClass(object):
    __metaclass__ = MyTypeSubclass

或者,在 Python 3 中:

class MyClass(metaclass=MyTypeSubclass):
    pass

这给出了有趣的结果isinstance(MyClass, MyTypeSubclass) == True。不过,这有点超出了这个答案的范围。

于 2013-08-30T14:41:00.997 回答
1

dict()dict实例的构造函数。当你这样做时,dir(dict)你正在查看 class 的属性dict。当您编写时,a = dict()您将设置a为 type 的新实例dict

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

于 2013-08-30T14:11:10.090 回答
0

注意调用dir构造函数dict.__init__

dir(dict.__init__)

为您提供您所期望的,包括与任何其他功能相同的东西。由于对dict()构造函数的调用会导致对 的调用dict.__init__(instance),这就解释了这些函数属性的去向。(当然,在任何构造函数中都有一些额外的幕后工作,但这对于字典和任何对象都是一样的。)

于 2013-08-30T21:55:36.603 回答