Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python内置函数是';t真的不起作用,对吗?_Python - Fatal编程技术网

Python内置函数是';t真的不起作用,对吗?

Python内置函数是';t真的不起作用,对吗?,python,Python,我刚刚想到Python的dict“函数”,并开始意识到dict根本不是一个函数。例如,如果我们执行dir(dict),我们会得到用户定义函数的常规名称空间中不包含的各种方法。扩展这种思想,它类似于dir(list)和dir(len)。它们不是函数,而是真正的types。但是我对文档页面感到困惑,它清楚地说明了函数。(我想它应该只是说内置的可调用项) 那么是什么原因呢?(开始觉得区分类和函数很简单)它是一个可调用的函数,一般来说类也是如此。调用dict()实际上就是调用dict构造函数。这就像定义

我刚刚想到Python的
dict
“函数”,并开始意识到
dict
根本不是一个函数。例如,如果我们执行
dir(dict)
,我们会得到用户定义函数的常规名称空间中不包含的各种方法。扩展这种思想,它类似于
dir(list)
dir(len)
。它们不是函数,而是真正的
type
s。但是我对文档页面感到困惑,它清楚地说明了函数。(我想它应该只是说内置的可调用项)


那么是什么原因呢?(开始觉得区分类和函数很简单)

它是一个可调用的函数,一般来说类也是如此。调用
dict()
实际上就是调用dict构造函数。这就像定义自己的类(
C
),然后调用
C()
来实例化它。

dict()
dict
实例的构造函数。执行
dir(dict)
操作时,您正在查看class
dict
的属性。当您写入
a=dict()
时,您正在将
a
设置为类型为
dict
的新实例


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

与之相比,
sum
的一种特殊方式是,尽管两者都是
可调用的
,并且都是用C实现的(无论如何,在cpython中),
dict
是一种
类型
;也就是说,
isinstance(dict,type)=True
。这意味着您可以使用
dict
作为其他类型的基类,您可以编写:

class MyDictSubclass(dict):
    pass
class MyTypeSubclass(type):
    pass

class MyClass(object):
    __metaclass__ = MyTypeSubclass
但不是

class MySumSubclass(sum):
    pass
这有助于使类的行为几乎像一个内置对象,但有一些增强。例如,您可以定义
tuple
的子类,该子类将
+
实现为向量加法而不是串联:

class Vector(tuple):
    def __add__(self, other):
        return Vector(x + y for x, y in zip(self, other))
这引出了另一个有趣的观点<代码>类型也在C中实现。它也可以调用。像
dict
(不像
sum
),它是
类型的一个实例<代码>isinstance(类型,类型)=True
。由于这种奇怪的、看似不可能的循环,
type
可以用来创建新的类类(称为元类)。你可以写:

class MyDictSubclass(dict):
    pass
class MyTypeSubclass(type):
    pass

class MyClass(object):
    __metaclass__ = MyTypeSubclass
或者,在Python 3中:

class MyClass(metaclass=MyTypeSubclass):
    pass

这给出了一个有趣的结果,
isinstance(MyClass,MyTypeSubclass)==True
。但是,它的有用性超出了这个答案的范围。

请注意,在构造函数
dict上调用
dir
。\uuuu init\uuu

dir(dict.__init__)

提供您期望的内容,包括与任何其他函数相同的内容。由于对
dict()
构造函数的调用会导致对
dict.\uuuu init\uuuu(实例)
的调用,这就解释了这些函数属性的去向。(当然,在任何构造函数中都会有一些额外的幕后工作,但对于dicts和任何对象都是一样的。)

,对吗?请注意,
dir()
从来没有打算给出可用函数的完整概述
dir(type)
为您提供了许多相同的函数。我同意这些函数的方面更多地指向类的方向,而不是函数的方向。毕竟,如果dict是一个纯函数的话,你可以做像isinstance(x,dict)这样的事情,但这不应该起作用。我个人认为他们只是把它称为函数。就像我看到一些人把它称为数组或列表:<代码>(‘a’,‘b’)< /代码>,当它的技术术语是“元组”。注意,句子已经变成了<代码>。Python解释器有许多函数和类型,内置的函数总是可用的。但是为什么我们要在文档页面上调用它们
函数
?似乎拥有
函数
的名称是非常微不足道的。@PhillipCloud我理解其中的区别,但您肯定可以承认,当用户定义的函数有
func\u闭包、
和所有内置项都不支持它。@EdgarAroutiounian构造函数实际上是
类型
对象上的一个方法。这种方法当然是一种特殊的函数。区分由
def
语句创建的函数(而不是方法)和类及其构造函数绝对不是一件小事。您认为这种区别微不足道,这意味着您可能没有编写过很多函数和/或类。如果你理解类和函数之间的区别以及类与可调用项之间的关系,那么调用
dict
一个函数也不会让人感到困惑。@PhillipCloud迂腐与否,这是一个清晰的问题。重读我的文章,我从来没有说过函数和类的区别确实微不足道,相反,至少从表面上看,它似乎是这样的,而且也许内置函数页面的文档最好称为内置可调用页面。在任何情况下,我都不确定Stack从一个OP编写了多少类或函数的毫无意义的推测中得到了什么好处,也许你想推测一下OP也编写了多少行代码?@Edgar我和你完全一样,我不喜欢使用术语时出现混乱和缺乏精确性,我认为最好将其称为
dict()
构造函数,因为它不仅仅是一个初始化函数。它还分配一个新实例。@Codie CodeMonkey我想知道您是否希望调用
dict()
构造函数