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
的一个实例 . 由于这个奇怪的、看似不可能的循环,可以用来制作新的类(称为元类)。你可以写:type
isinstance(type, type) == True
type
class MyTypeSubclass(type):
pass
class MyClass(object):
__metaclass__ = MyTypeSubclass
或者,在 Python 3 中:
class MyClass(metaclass=MyTypeSubclass):
pass
这给出了有趣的结果isinstance(MyClass, MyTypeSubclass) == True
。不过,这有点超出了这个答案的范围。