Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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 什么是「;头等舱;物体?_Python_Language Agnostic - Fatal编程技术网

Python 什么是「;头等舱;物体?

Python 什么是「;头等舱;物体?,python,language-agnostic,Python,Language Agnostic,在给定的编程语言中,对象或其他对象何时被称为“第一类”,为什么?它们与其他语言有什么不同 编辑。当一个人说“一切都是一个对象”(就像在Python中),他真的是指“一切都是一流的”吗?简而言之,这意味着对对象的使用没有限制。这和 任何其他物体 第一类对象是一个实体,可以动态创建、销毁、传递给函数、作为值返回,并拥有编程语言中其他变量所拥有的所有权限 这取决于语言,可以 暗示: 可以表示为匿名文字值 可存储在变量中 可存储在数据结构中 具有内在身份(独立于任何给定名称) 与其他实体在平等性方面具

在给定的编程语言中,对象或其他对象何时被称为“第一类”,为什么?它们与其他语言有什么不同


编辑。当一个人说“一切都是一个对象”(就像在Python中),他真的是指“一切都是一流的”吗?

简而言之,这意味着对对象的使用没有限制。这和 任何其他物体

第一类对象是一个实体,可以动态创建、销毁、传递给函数、作为值返回,并拥有编程语言中其他变量所拥有的所有权限

这取决于语言,可以 暗示:

  • 可以表示为匿名文字值
  • 可存储在变量中
  • 可存储在数据结构中
  • 具有内在身份(独立于任何给定名称)
  • 与其他实体在平等性方面具有可比性
  • 作为过程/函数的参数是可以通过的
  • 作为程序/功能的结果是可返回的
  • 在运行时是可构造的
  • 可打印
  • 可读
  • 可在分布式进程之间传输
  • 可在正在运行的进程之外存储

在C++函数中,p>不是第一类对象,但是:

  • 您可以重写“()”运算符,使其有可能拥有一个对象函数,这是第一类
  • 函数指针是第一类的
  • boostbind、lambda和function确实提供了一流的函数
在C++中,类不是第一类对象,但这些类的实例是。在Python中,类和对象都是第一类对象。(有关类作为对象的更多详细信息,请参见)

下面是Javascript第一类函数的示例:

// f: function that takes a number and returns a number
// deltaX: small positive number
// returns a function that is an approximate derivative of f
function makeDerivative( f, deltaX )
{
    var deriv = function(x)
    { 
       return ( f(x + deltaX) - f(x) )/ deltaX;
    }
    return deriv;
}
var cos = makeDerivative( Math.sin, 0.000001);
// cos(0)     ~> 1
// cos(pi/2)  ~> 0

非第一类对象的实体称为第二类对象。C++中的函数是第二类,因为它们不能动态创建。 关于编辑:

编辑。当一个人说“一切都是 一个对象(就像Python中的一样),他会这样做吗 确实是指"一切都是" 头等舱“


术语对象可以随意使用,并不意味着是第一类。将整个概念称为“第一类实体”可能更有意义。但在Python中,他们的目标是让一切都成为一流。我相信发表你声明的人的意图是指头等舱

“头等舱”意味着您可以按常规方式对其进行操作。大多数情况下,这只是意味着您可以将这些一级公民作为参数传递给函数,或者从函数返回它们

这对于对象来说是不言而喻的,但对于函数甚至类来说并不总是如此明显:

void f(int n){返回n*2;}
void g(动作a,int n){返回a(n);}
//现在调用g并传递f:
g(f,10);/=20

这是C#中的一个例子,其中函数实际上不是一级对象。因此,上面的代码使用了一个小的变通方法(即称为
Action
的通用委托)将函数作为参数传递。其他语言,如Ruby或Python,甚至允许将类和代码块视为普通变量(或者在Ruby中为常量)。

在我看来,这是用自然语言描述事物的隐喻之一。该术语基本上用于将函数描述为第一类对象

如果你考虑一个面向对象的语言,我们可以将各种特性赋予对象,例如继承、类定义、传递到代码的其他部分(方法参数)的能力、存储在数据结构中的能力等。如果我们可以用一个通常不被视为对象的实体来做同样的事情,与java脚本中的函数一样,此类实体被视为第一类对象

这里的第一类本质上是指,不作为第二类处理(行为降级)。从本质上讲,模拟是完美的或无法区分的。

“当一个人说“一切都是对象”(就像Python中的一样)时,他真的是指“一切都是一流的”吗?”

Python中的所有内容都是适当的对象。甚至是其他语言中的“原始类型”

您会发现像
2
这样的对象实际上有一个相当丰富和复杂的界面

>>> dir(2)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
因为在Python中,所有东西都是一流的对象,所以很少有模糊的特殊情况

例如,在Java中,有一些基本类型(int、bool、double、char)不是正确的对象。这就是为什么Java必须引入Integer、Boolean、Double和Character作为第一类类型。这可能很难教给初学者——不清楚为什么原始类型和类必须同时存在

这也意味着一个对象的类本身就是一个对象。这与C++不同,在运行时,类并不总是存在明显的差异。
2
的类型是
类型“int”
对象,它具有方法、属性和类型

>>> type(2)
<class 'int'>
从幻灯片中,第2A课(1986年)依次引用:

一等公民的权利和特权:

  • 以变量命名
  • 作为参数传递给过程
  • 作为过程的值返回
  • 要合并到数据结构中

现代Python也是如此。在旧Python(版本1?在我的时代之前)中,您不能从
int
继承。因此,“旧的”和“新的样式类”(在第3章中,不再有旧的样式类),这在现代python中甚至都不是真的。忽略为什么这会有用所有位/布尔运算符都不是第一类对象。试试
dir(&)
。仍然有一些语言语法不尽相同
>>> type(type(2))
<class 'type'>