zoukankan      html  css  js  c++  java
  • 按对象调用

    “ 用一个词时,Humpty Dumpty用一种相当鄙视的语气说,这意味着我选择它的意思,既不多也不少。

    问题是,爱丽丝说,你是否可以说出很多不同的词。

    问题是,Humpty Dumpty说,这是主人 - 这就是全部。

    有时候,读过一点CS而不是很多CS(或者只是一种CS的太多)的人会在comp.lang.python上弹出并浪费大量精力试图告诉大家Python的使用情况一些它并没有真正使用的调用模型。事实证明,他们并不真正了解Python的模型,而且他们常常也不了解他们最喜欢的模型。

    但是,没关系,需要知道的唯一事情是Python的模型既不是“按值调用”也不是“按引用调用”(因为任何尝试将这些术语用于Python都要求你使用非标准的单词定义“ -值“和” - 参考“)。最准确的描述是CLU的“ 按对象调用 ”或“ 通过共享调用 ”。或者,如果您愿意,“ 按对象引用调用 ”。

    如果你还没有这样做,你也应该阅读这篇文章

    以下摘录取自旧的comp.lang.python线程。有趣的部分是CLU文本,它们提供了Python调用模型的非常简洁的描述。

    (有一天,我会把它变成一篇合适的文章...)


     
    日期:2003年5月14日星期三08:48:08 +0200
    
    >见
    >
    > http://wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?call-by-value
    >
    >您所描述的是按价值调用。
    
    有趣的是,你引用FOLDOC,因为FOLDOC没有
    在CLU中可以看到Python的模型作为call-by-value
    条目:
    
        http://wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?CLU
    
        “通过分享呼叫传递参数,类似于
        call-by-value,除了参数是对象
        并且只有在它们可变的情况下才能改变。“
    
    注意使用“相似”和“除外”这两个词。
    
    有关CLU的对象和参数传递模型的简要说明,
    见[1]。我想你会发现它很适合Python的模型。
    
    Liskov等人的CLU参考手册[2]说(第14页):
    
        “我们通过sharing_调用传递技术_call的参数,
        因为参数对象是在。之间共享的
        调用者和被调用的例程。这种技术没有
        对应于大多数传统的论证传递技术
        (它类似于在LISP中传递的论点)。特别是它
        不是因为价值的调​​用,因为
        由被调用的例程形成的调用者将可以看到。
        它不是通过引用调用,因为没有给出访问权限
        调用者的变量,但仅限于某些对象。“
    
    注意使用“不”和重复使用“它不是”。
    我要强调一下:
    
        “特别是因为突变而不是值得称呼
        由被调用例程执行的参数将被显示
        呼叫者,召集者。并且因为访问而不是参考
        没有给出调用者的变量,而仅仅是某些变量
        对象“。
    
    CLU是在七十年代中期设计的,这本参考手册
    发表于1979年。在其他文献中,CLU设计师有些 - 
    次将这个模型称为“按对象调用”[3],或者他们仔细
    通过谈论“对象”而不是价值观来忽略这个问题
    “引用其他对象的对象”而不是引用[1],但是
    我找不到一个他们离开的地方“特别是
    它不是通过价值来调用“它”是按价值调用“。
    
    那你七十年代初被困的借口是什么?;-)
    
    </ F>
    
    1)http://www.cs.berkeley.edu/~jcondit/pl-prelim/liskov77clu.pdf
    2)http://www.lcs.mit.edu/publications/pubs/pdf/MIT-LCS-TR-225.pdf
    3)http://www.lcs.mit.edu/publications/pubs/pdf/MIT-LCS-TR-561.pdf
    

     
    日期:2003年5月14日星期三15:49:09 +0200
    
    >同样有趣的是[分享号码]缺失
    
    你读过“为什么这个定义丢失?” 页?
    
    (FOLDOC维护者添加了应该写的文章的链接
    有一天,并跟踪链接获得的点击次数,所以他们
    可以专注于人们真正想要阅读的事情)
    
    >为了一个很好的语义介绍,我会说
    >
    >编程语言要点
    > Daniel P. Friedman,Mitchell Wand,Christopher Thomas Haynes
    
    如果你只有计划等
    
    >我不熟悉CLU
    
    我建议阅读参考文献3。
    
        http://www.lcs.mit.edu/publications/pubs/pdf/MIT-LCS-TR-561.pdf
    
    CLU是OO语言发展的重要里程碑;
    从上面的论文中引用利斯科夫本人的话:
    
        “关于CLU的工作,以及其他相关工作
        Alphard,有助于明确数据抽象的概念
        并使其精确。因此,这个概念被广泛使用
        程序设计中的组织原则已成为一个
        现代编程方法论的基石。“
    
    如果你不知道你的历史等
    
    >但我认为这是对Python的论证传递的描述
    >语义是误导。
    
    你读过参考文献1吗?
    
        http://www.cs.berkeley.edu/~jcondit/pl-prelim/liskov77clu.pdf
    
    如果您的PDF阅读器坏了,以下是相关部分
    该文件(由我添加的任何拼写错误等)。
    
        “CLU语义的基本元素是_objects_和
        _variables_。对象是创建的数据实体
        由CLU程序操纵。变量只是使用的名称
        在程序中引用对象。
    
        在CLU中,每个对象都有一个特定的_type_,它具有特征
        它的行为。类型定义了一组创建的操作
        并操纵该类型的对象。可以创建对象
        并且只能通过其类型的操作进行操作。
    
        对象可以_refer_到对象。例如,一个记录对象
        指的是作为记录组件的对象。
        这个概念是逻辑的,而不是物理的遏制。
        特别是,有两个不同的记录对象可能
        引用(或_share_)相同的组件对象。如果是
        一个循环结构,甚至可能是一个对象
        “包含”本身。因此,可以具有递归数据
        结构定义和共享数据对象没有显式
        参考类型。/.../
    
        CLU对象独立于过程激活而存在。空间
        for对象是从动态存储区域/.../ In中分配的
        理论上,所有物体永远存在。在实践中,
        当对象不是时,对象使用的空间可以被回收
        任何CLU计划都可以访问更长时间
    
        对象可能表现出时变行为。这样的对象,
        称为_mutable_对象,具有可以修改的状态
        某些操作无需改变身份
        宾语。/.../
    
        如果一个可变对象_m_由另外两个对象_x_和
        _y_,然后通过_x_对_m_进行修改
        _m_通过_y_进行检查。/.../
    
        调用不表现出时变行为的对象
        _immutable_个对象或常量。常数的例子是
        整数,布尔值,字符和字符串。a的价值
        常量对象无法修改。例如,新字符串
        可以从旧的计算,但现有的字符串不计算
        更改。类似地,没有一个整数运算修改
        整数作为参数传递给它们。
    
        变量是CLU程序中用于_denote_特定的名称
        执行时的对象。与许多常见的变量不同
        编程语言,_are_对象_concon_
        值,CLU变量只是程序员使用的名称
        引用对象。因此,有两个变量是可能的
        表示(或_share_)同一个对象。CLU变量很多
        与LISP中的那些一样,与其他的指针变量相似
        语言。但是,CLU变量是_not_对象; 他们
        不能用其他变量表示或引用
        对象。/.../
    
        CLU中的基本操作是_assignment_和_procedure
        invocation_。赋值原语'x:= E',其中_x_是a
        变量和_E_是一个表达式,导致_x_表示
        由_E_的评估产生的对象。例如,如果
        _E_是一个简单的变量_y_,然后是赋值'x:= y'
        导致_x_表示_y_表示的对象。对象是
        _not_复制后,_x_和_y_将为_shared_。分配
        不会影响任何对象的状态。(回想一下'rs:=
        v'不是真正的赋值,而是'put.s的缩写(r,
        V)”。)
    
        过程调用涉及从中传递参数对象
        调用被调用过程并返回结果对象
        调用者的过程。一个正式的论点
        程序被认为是程序的局部变量
        并通过赋值初始化为结果对象
        来自对参数表达式的评价。这样论证
        对象在调用者和被调用过程之间共享。
        一个过程可以修改可变参数对象(例如记录),
        但当然它不能修改不可变的(例如整数)。
        过程无法访问其调用者的变量。
    
        程序调用可以直接用作语句; 那些
        返回对象也可以用作表达式。随意
        允许递归程序。“
    
    将“CLU”替换为“Python”,将“record”替换为“instance”和“procedure”
    使用“功能或方法”,您将获得非常准确的描述
    Python的对象模型。
    
    如果您不同意,请告诉我们Python的不同之处。
    具体。
    
    </ F>
    
    

     
    日期:2003年5月15日星期四15:55:57 +0200
    
    蒂姆彼得斯写道:
    
    >所以它 - 不管你信不信,有时不同的人意味着不同
    >用相同的词语<wink>。
    
    这就是为什么你应该只使用URL和URL来识别概念。
    
    >歪曲“按价值呼吁”的意思是“内部地址”
    >对象是价值“即使在功能世界中也不常见,
    >虽然。
    
    好吧,我想你可以在理论上重视分配的人为数字
    一个对象和对象本身一样多。
    
        “乔,我想我们的儿子可能会在树林里迷路”
        “别担心,我有他的社会安全号码”
    
    </ F>
    
    

     
    日期:2003年5月15日星期四23:11:53 +0200
       
    >不,这正是应用于Python值时的call-by-value意味着什么
    >(实际上是r值)。尝试此操作时会发生什么:
    >
    > >>> y = [1,2,3]
    > >>> x = y
    > >>> x [:] = [-1] * 3
    > >>> y
    > [-1,-1,-1]
    >
    >相同的行为,没有函数调用。
    
    除了“x [:] =”*是*方法调用。
    
    x [:] = [-1] * 3将切片对象和([-1] * 3)的结果传递给
    x .__ setitem__方法,使用标准调用机制
    (这就是语言参考中“被提问的对象”的内容
    手段)
    
    “xy =”也是一个方法调用(__setattr__)。
    
    所以是“x [y] =”(__ setitem__,再次)。
    
    但是,“x = y”不是。
    
    (三十年前,CLU也看起来有语法糖
    喜欢不知情观察者的任务,但实际上还没有
    另一种调用程序的方法。这里没什么新鲜的。)
    
    </ F>
    
    

     
    日期:2003年5月15日星期四23:39:30 +0200
    
    >根据约书亚,我和R5RS。R5RS说
    >
    >“当稍后调用某个实际的程序时
    >参数,lambda表达式所在的环境
    >被评估将通过绑定变量来扩展
    >在正式的论点清单中,新鲜的地点,
    >将存储相应的实际参数值
    >在那些位置,以及身体中的表达
    将按顺序评估lambda表达式的>
    >在扩展的环境中。“
    >
    >根据定义,这是按值调用的。
    
    但这不是Python的工作原理。
    
    在Python中,形式参数列表中的变量绑定到
    实际的参数对象。对象在调用者之间是_shared_
    和被叫者; 没有“新鲜的地点”或涉及额外的“商店”。
    
    (当然,这就是为什么CLU人称这种机制为“呼叫 - 
    分享“。他们是真正的计算机科学家,为一个人工作
    真正的计算机科学实验室;-)
    
    和顺便说一下,Python函数不能在扩展环境中运行,
    无论是。功能体对周围环境的访问非常有限
    环境。但这是另一个故事。
    
    </ F>
    
    

     
    日期:2003年5月16日星期五00:25:45 +0200
    
    >只是在这里,我不同意你的意见。我考虑Python值
    >他们自己是对象引用
    
    如果你继续发明自己的术语,你永远不会赢得这个
    参数:
    
        http://www.python.org/doc/current/ref/objects.html
    
        “对象,价值观和类型”
    
        _Objects_是Python的数据抽象。一个中的所有数据
        Python程序由对象或关系表示
        对象之间。
    
        每个对象都有一个标识,一个类型和一个值。一个对象
        _identity_一旦创建就永远不会改变; 你可以
        把它想象成对象在内存中的地址。/.../一个对象
        _type_也是不可更改的。它确定了那些操作
        一个对象支持(例如,``它有一个长度?'')还有
        定义该类型对象的可能值。/.../
        某些对象的_value_可以更改。值可以的对象
        改变据说是_mutable_; 价值不合的对象
        创建后可更改的名称为_immutable_。
    
    (这与CLU论文中的术语基本相同,除了
    他们使用术语“状态”而不是Python的“价值”)
    
    ...所以我猜你一直在说的是Python
    使用按身份调用,而不是按州调用。很公平。
    
    </ F>
    
    

     
    日期:2003年5月16日星期五01:05:37 +0200
    
    >这是使用CLU值(对象)的按值调用的描述
    >参考)。
    
    所以?如果,在doug-speak中,对象引用是相同的
    值,这也是对象引用的描述。
    
    您的观点是,您可以重新定义单词以使其具有意义
    任何你想要的?我想我们已经注意到了......
    
    </ F>
  • 相关阅读:
    handsontable合并项mergeCells应用及扩展
    handsontable的基础应用
    overflow的使用
    阿里云服务器磁盘空间扩容步骤
    使用Gitblit 在Windows2008 r2上部署Git Server(完整版)
    搭建一个基于微信公众号的信息采集功能
    js数组内置方法
    C#数组、js数组、json
    将EF项目从dbfirst转化为codefirst
    通过HttpWebRequest调用webService
  • 原文地址:https://www.cnblogs.com/Xingtxx/p/11044223.html
Copyright © 2011-2022 走看看