只是考虑Python的dict
“函数”并开始意识到dict
根本不是一个函数。例如,如果我们执行dir(dict)
,我们会得到各种方法,这些方法不包含在用户定义函数的通常命名空间中。扩展该思想,类似于dir(list)
和dir(len)
。它们不起作用,但真的是type
。但后来我对文档页面http://docs.python.org/2/library/functions.html感到困惑,它明确地说明了函数。 (我想它应该只是说内置的callables)
那是什么给出的? (开始看起来对类和函数进行区分是微不足道的)
答案 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相同。)