只是考虑Python的dict "功能",并开始意识到这dict根本不是一个功能.例如,如果我们这样做dir(dict),我们会得到各种方法,这些方法不包含在用户定义函数的通常命名空间中.扩展这个想法,它dir(list)和dir(len).他们不是功能,但真的type是.但后来我对文档页面http://docs.python.org/2/library/functions.html感到困惑,它清楚地说明了函数.(我想它应该真的只是说内置的callables)
什么给出了什么?(开始看起来对类和函数的区分是微不足道的)
这是一个可调用的,一般的类.调用dict()有效地调用dict构造函数.就像你定义自己的类(C比方说)并调用C()它来实例化它一样.
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。不过,这是如何有用的有点超出了这个答案的范围。