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

Edg*_*ian 9 python

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

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

Ham*_*ite 5

这是一个可调用的,一般的类.调用dict()有效地调用dict构造函数.就像你定义自己的类(C比方说)并调用C()它来实例化它一样.

  • 我理解它是一个可调用的,但是为什么我们在文档页面上将它们称为`functions`?似乎拥有名称`class`和`function`是非常微不足道的. (2认同)

Sin*_*ion 3

dict与 相比,一种特殊的方式sum是,虽然两者都是callable,并且都是用 C 实现的(无论如何,在 cpython 中),但;dict是一个type; 那是,isinstance(dict, type) == True。这意味着你可以用作dict其他类型的基类,你可以这样写:

class MyDictSubclass(dict):
    pass
Run Code Online (Sandbox Code Playgroud)

但不是

class MySumSubclass(sum):
    pass
Run Code Online (Sandbox Code Playgroud)

这对于使类的行为几乎像内置对象一样有用,但有一些增强。例如,您可以定义一个子类来tuple实现+向量加法而不是串联:

class Vector(tuple):
    def __add__(self, other):
        return Vector(x + y for x, y in zip(self, other))
Run Code Online (Sandbox Code Playgroud)

这就引出了另一个有趣的观点。 type也是用 C 实现的。它也是可调用的。就像dict(和不像)它是;sum的一个实例。。由于这种奇怪的、看似不可能的循环,可以用来创建新的类的类(称为元类)。你可以写:typeisinstance(type, type) == Truetype

class MyTypeSubclass(type):
    pass

class MyClass(object):
    __metaclass__ = MyTypeSubclass
Run Code Online (Sandbox Code Playgroud)

或者,在 Python 3 中:

class MyClass(metaclass=MyTypeSubclass):
    pass
Run Code Online (Sandbox Code Playgroud)

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