资讯专栏INFORMATION COLUMN

Python为为什么要储存显式self

89542767 / 207人阅读

  全文详细描述Python为为什么要储存显式self,文中依据案例编码介绍的十分详尽,对大家课程的学习、学习培训或工作也有极强的参照学习培训和考核实用价值。务必陪我共同进步。


  Bruce的提议


  Bruce了解,大家一般用一个方法来划分实例变量的引进和其它自变量的引进,因而他建议“self”设定关键词。


  充分考虑最具代表性的一类,生活中有一个方法,比如:


  class C:
  def meth(self,arg):
  self.val=arg
  return self.val
  根据Bruce这将会改成:
  class C:
  def meth(arg):#Look ma,no self!
  self.val=arg
  return self.val


  那样,每一种方式将节约6字符。但我不这样认为Bruce这一建议就是为减少电脑打字。


  我觉得他真真正正在意的是程序猿浪费时长(很有可能来源于外国语言),有时候好像不用特定“self”主要参数,她们有时候忘掉加上(即便她们比较清楚——习惯是一种无穷的力量)。实际上,在引入实例自变量或方式之前忘掉键入“self.”比较之下,省去了参数列表“self”,通常会造成十分模糊不清的错误报告。


  或许更糟糕是指(比如Bruce上述),当方式被恰当表明,但启用时主要参数总数不校时,这时接收到的错误报告。Bruce下列事例:


  我答应这也是令人困惑的,但我情愿处理这一不正确消息,而非改动语言表达。


  为什么Bruce建议行不通


  最先,要我提些Bruce典型性论点论据的反过来提议。


  Traceback(most recent call last):
  File"classes.py",line 9,in
  obj.m2(1)
  TypeError:m2()takes exactly 3 arguments(2 given)

  有非常好的论点论据能证明在参数列表中应用显式“self”本质上能增强下列二种调用方法的等效性。“foo”是“C”1个事例:


  foo.meth(arg)==C.meth(foo,arg)

  (坦白说,我不理解这个案例的意味。下列仅仅是个人见解。在类内部结构声明数组中,可能有几类不同类型的方式:实例方法、类方法与静态方法。他们角色与行为是不一样的,那样怎么区分界定和启用呢?Python约定好一个方法,则在界定时要第一位主要参数来划分:self表示案例法,cls或其它矩阵表示类方式……这三种方式如同两个扁豆相同,看上去完全一致,如同上事例的左边等于号相同。这时,应依据界定时给的主要参数开展区划。比如,在墙上实例等于号的右侧,第一位主要参数是实例对象,表示此处是实例方式。


  另外论点论据要在参数列表中应用显式“self”将一个函数插进一个类,得到动态性改动1个类水平,并建立对应的类方式。


  比如,大家可以在上构建一个“C”彻底等效电路的类,具体如下:


  #Define an empty class:
  class C:
  pass
  #Define a global function:
  def meth(myself,arg):
  myself.val=arg
  return myself.val
  #Poke the method into the class:
  C.meth=meth


  一定要注意,我将会“self”主要参数重新命名为“myself”为了能注重(在语法结构上),我们并没有在这儿界定一个方法(汉语翻译注:类外界是函数公式,其实就是函数公式,换句话说,function,内部方式,即method)。


  那样以后,C有个事例“meth”方式,此方法有个主要参数,并且作用与之前相同。它乃至适用在插入方式类之前建立的C的事例。


  我觉得Bruce我不在意前面提到的等效性。我答应那只是理论的必要性。我最想得到的除外便是老式启用非常方式的组成(idiom)。可是,这一组成非常容易出差错(也正是因为它务必显式传送("self"缘故),这也是为什么Python在3000中,个人觉得在大多数前提下使用这些"super()"的主要原因。


  Bruce你很有可能都会想到一个方法来让第2个等效电路案例——在一些前提下,这类等效电路至关重要。我也不知道Bruce我花多少时长想着如何完成它的提议,但我觉得他正在努力将一个称为“self”在类上直接界定的全部方式全部方式的念头(我不得不说成“直接的”那样,嵌入在方式里的函数公式就能避免这类自动操作)。用这种方式,第一位等效电路案例可以维持等效电路。


  可是,有一种方法我觉得Bruce未与编译程序加上某些东西根本不可能ESP解决方法:装饰设计设备。我我想这是Bruce最后不成功的提议。


  在我们装饰设计一个方法时,谁也不知道是否该全自动加上它“self”主要参数:装饰设计设备能将函数公式转换成静态方法(不“self”)或类方式(有个有意思的方式(self,它偏向一个类,而不只是事例),或是它能够做些截然不同的事儿(纯粹应用Python完成“classmethod”或“staticmethod”装饰设计设备很繁琐)。如果你了解装饰器的用处,不然没有别的方式来再决定是否得出一类掩藏的方法去界定它“self”主要参数。


  我拒绝独特外包装等“classmethod”和“staticmethod”高科技什么的。我还认为,除开自查以外,全自动明确一个方法是一类方式(classmethod),实例方法(instancemethod)依然静止的(staticmethod),这个不是一个好办法(如同)Bruce在文章中的评论里,有些人提议):这也使得难以只遵照方式以前的方式“def”,确定怎样调这个方法。


  (汉语翻译注:针对一个方法,在加上相对应参数当前情况下,能够简单的加上装饰器来划分这是什么样的方法,而且在启用时非常容易区别启用;可是,要是没有加上主要参数,即便大家可以应用奇妙的全自动体制来划分这是什么样的方法,你也不确定在启用时怎样启用)。

  def foo(self,arg):...


  在评论里,我看见了某些十分极端化对Bruce建议的附合,但一般代价也是很难遵守规则,或需要深层次的语言表达改动,这也使得大家极为无法接受,特别是合拼Python3.1.顺便说一下,对3..1、再度申明我们自己的标准,新特点仅有在保证向后兼容的情形下才可以接纳。

  def self.foo(arg):...


  有个看起来切实可行的提议(能使其向后兼容)是类中的意见


  classmethod
  def cls.foo(arg):...


  好啦,和现在的状况对比,我喜欢这个。Bruce我觉得它的blog发表评论所提出的提议或者更极端化这样的说法要好很多,并且其具有向后兼容性极大的优点,能用参照完成而无需太多勤奋PEP。(我觉得Bruce假如他确实勤奋写下可信赖的文章内容,他大概自身提议中的不足PEP或尝试完成它。


  综上所述,这篇文章就给大家介绍完毕,希望可以给大家带来帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128851.html

相关文章

  • SICP Python 描述 第五章 序列和协程

    摘要:消息向迭代器获取所表示的底层序列的下一个元素。为了对方法调用做出回应,迭代器可以执行任何计算来获取或计算底层数据序列的下一个元素。这个迭代器应拥有方法,依次返回序列中的每个元素,最后到达序列末尾时产生异常。 第五章 序列和协程 来源:Chapter 5: Sequences and Coroutines 译者:飞龙 协议:CC BY-NC-SA 4.0 5.1 引言 在这一章中,我...

    leap_frog 评论0 收藏0
  • SICP Python 描述 2.7 泛用方法

    摘要:使用消息传递,我们就能使抽象数据类型直接拥有行为。构造器以类似的方式实现它在参数上调用了叫做的方法。抽象数据类型允许我们在数据表示和用于操作数据的函数之间构造界限。 2.7 泛用方法 来源:2.7 Generic Operations 译者:飞龙 协议:CC BY-NC-SA 4.0 这一章中我们引入了复合数据类型,以及由构造器和选择器实现的数据抽象机制。使用消息传递,我们就能...

    leanote 评论0 收藏0
  • [译] 与 Python 无缝集成——基本特殊方法 3

    摘要:比较运算符方法有六个比较运算符。根据文档,其映射工作如下第七章创建数字我们会再次回到比较运算符这块。同一个类的对象的比较实现我们来看看一个简单的同一类的比较通过观察一个更完整的类现在我们已经定义了所有六个比较运算符。 注:原书作者 Steven F. Lott,原书名为 Mastering Object-oriented Python __bool__()方法 Python对假有个很...

    2json 评论0 收藏0
  • django rest framework个人学习笔记(六)————Tutorial4.认证于授权

    摘要:另外一个字段用于储存突出显示的代码的表示形式。这将确保认证用户拥有读写权限,而未认证用户只有读的权限。唯一的限制是必须是。 官网地址目前,我们的API没有对如 edit 或者 delect做出任何限制。我们希望有一些更加高级的功能能够做到: Code snippets 应该永远和创建者相关 只有认证的用户才能够创建snippets 只有创建者才能更新或者删除他的snippet 没有认...

    eternalshallow 评论0 收藏0
  • django rest framework个人学习笔记(六)————Tutorial4.认证于授权

    摘要:另外一个字段用于储存突出显示的代码的表示形式。这将确保认证用户拥有读写权限,而未认证用户只有读的权限。唯一的限制是必须是。 官网地址目前,我们的API没有对如 edit 或者 delect做出任何限制。我们希望有一些更加高级的功能能够做到: Code snippets 应该永远和创建者相关 只有认证的用户才能够创建snippets 只有创建者才能更新或者删除他的snippet 没有认...

    MonoLog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<