对象方法

时间:2017-09-16 18:31:28

标签: python augmented-assignment

允许:a = 5b = 10hello_world = 'Hello World'

据我所知:Python允许我们利用赋值运算符来防止我们不得不重复左操作数。例如,a = a + b可以重写为a += b,其中两者都会返回15

因此,对于某些Python对象,它可能有些类似,具体取决于被调用的方法返回的内容。

使用字符串str或本案例我们的字符串hello_world,您可以使用多种方法以某种方式修改它,例如hello_world.lower(),有时我会调用它来为变量分配方法的结果。例如,hello_world = hello_world.lower()可以重写为hello_world .= lower(),其中两者都会返回hello world

Python中是否有类似的内容?这对你来说是完全荒谬或混乱的吗?好奇人们对此的看法和/或是否已存在。

2 个答案:

答案 0 :(得分:3)

  

Python中是否有类似的内容?

没有

  

这对你来说是完全荒谬还是令人困惑?

没有。也就是说,它与现有的增强赋值运算符(如+=*=等)略有不同。对于这些运算符,您可以定义一个特殊的魔术方法(__iadd____imul__等)来实现它们。这些的一个关键特性是,因为调用了一个单独的方法,所以它们可以就地更新对象。例如,如果x是列表,那么x += [1, 2, 3]实际上会改变对象x,而不是创建新列表。

对于您提议的.=运营商,目前尚不清楚这是如何运作的。如果有一个__imeth__运算符用于“扩充方法赋值”,它将作为参数采用什么?如果它将方法的名称作为参数,则需要__imeth__内的巨大if块来决定如何处理各种方法(即,if method == 'lower'来处理.lower()和等等)。如果它没有将方法的名称作为参数,它将如何知道被调用的方法?

更重要的是,现有运算符的一个基本特征是它们接受表达式作为它们的操作数。根据您提出的.=,如果您x .= 3会怎么样?还是x .= (foo+bar).blah()/7?甚至x .= lower(没有括号)?似乎.=要求其右手参数语法仅限于单个函数调用(将被解释为方法调用)。这与任何现有的Python运算符完全不同。

似乎处理所有这些问题的唯一方法是缩小提案的范围,使其确实只接受右侧的单个函数调用,并使其不可自定义,以便x .= method(...) x = x.method(...)是纯粹的语法糖。但是,如上所述,这比目前的增强任务所允许的要弱得多,所以我认为这不会是一个巨大的胜利。

答案 1 :(得分:2)

您正在考虑augmented assignments,这些是语句,并且不可扩展。

扩充分配仅涵盖二元运算符(特别是powerbinary arithmeticshiftingbinary bitwise运算符。 attribute reference syntax不是运算符,二进制或其他。因此,没有'属性 - 运算符'增强任务。

请注意,我没有涵盖calling syntax;你主要是谈论属性;您还调用str.lower()与属性查找分开。

如果您认为这个功能非常缺席,我建议您将其带到Python Ideas mailinglist,其中讨论了预期的新语言功能。

考虑到增强分配的,它们提供了优化就地更新的机会;它们不仅仅是语法糖。例如,对于列表,listobj += iterable_of_valueslistobj = listobj + iterable_of_values不同,它实际执行listobj.extend(iterable_of_values)(并将名称listobj绑定回listobj,可以导致suprising behaviour。对于属性访问,没有这样的机会;属性返回引用的名称,他们可以就地更新某些内容,除非您开始滥用{ {3}},它几​​乎不适合直观的增强。

您可能需要阅读为该语言引入扩充作业的descriptor protocol;在提出建议之前,特别需要阅读理由部分。