Python 对象方法中赋值运算符概念的可能性
让:Python 对象方法中赋值运算符概念的可能性,python,augmented-assignment,Python,Augmented Assignment,让:a=5,b=10,和hello\u world='hello world' 据我所知:Python允许我们利用赋值运算符来避免重复左操作数。例如,a=a+b可以重写为a+=b,两者都返回15 因此,对于某些Python对象,它可能有些相似,这取决于被调用的方法返回的内容 对于一个字符串,str,或者我们的字符串hello\u world,您可以使用多种方法以某种方式修改它,例如hello\u world.lower(),有时我会调用它来为变量指定其中方法的结果。例如,hello\u worl
a=5
,b=10
,和hello\u world='hello world'
据我所知:Python允许我们利用赋值运算符来避免重复左操作数。例如,a=a+b
可以重写为a+=b
,两者都返回15
因此,对于某些Python对象,它可能有些相似,这取决于被调用的方法返回的内容
对于一个字符串,str
,或者我们的字符串hello\u world
,您可以使用多种方法以某种方式修改它,例如hello\u world.lower()
,有时我会调用它来为变量指定其中方法的结果。例如,hello\u world=hello\u world.lower()
可以重写为类似于hello\u world.=lower()
的内容,两者都将返回hello world
Python中有类似的东西吗?这对你来说是完全荒谬的还是令人困惑的?好奇人们怎么看这个和/或它是否已经存在。你在想,这些都是语句,不可扩展
增广赋值仅包括二进制运算符(特别是,和运算符)。不是运算符、二进制运算符或其他运算符。因此,不存在“属性运算符”增广赋值
请注意,我并没有涵盖这个问题;你主要谈论的是属性;您还调用的str.lower()
与属性查找是分开的
如果你认为这是一个严重遗漏的特性,我建议你把它带到讨论未来新语言特性的地方
考虑到扩充任务的要点是,它们提供了优化就地更新的机会;它们不仅仅是语法上的糖。例如,对于列表,listobj+=iterable\u(值)
与listobj=listobj+iterable\u(值)
,它实际上执行listobj.extend(iterable\u(值)
(并将名称listobj
绑定回listobj
,这可能导致。对于属性访问,没有这样的机会;属性返回引用的名称,它们无法在适当的位置更新某些内容,除非您开始滥用,这几乎不利于直观的扩充
您可能需要阅读该语言的增广作业;在您提出此建议之前,特别需要阅读基本原理部分
Python中有类似的东西吗
没有
这对你来说是完全荒谬的还是令人困惑的
不。也就是说,它与现有的增广赋值运算符(如+=
,*=
等)有些不同。对于这些运算符,您可以定义一种特殊的魔术方法(\uuuuuidd\uuuuu
,\uiMul\uuuuu
等)它们的一个关键特性是,由于调用了一个单独的方法,它们可能会就地更新对象。例如,如果x
是一个列表,那么x+=[1,2,3]
实际上会改变对象x
,而不是创建一个新列表
对于您建议的=
运算符,不清楚这是如何工作的。如果“增强方法分配”有一个\uuu imeth\uuuu
运算符,它将以什么作为参数?如果它以方法的名称作为参数,则需要在\uu imeth\uuu
中使用一个巨大的If块来决定对各种方法执行什么操作(即,If method==“lower”
来处理.lower()
等等)。如果它没有将方法的名称作为参数,它如何知道调用的是什么方法
不过,更重要的是,现有运算符的一个基本特征是它们接受表达式作为操作数。对于您建议的=
,如果您执行x.=3
?或x.=(foo+bar).blah()/7
?甚至x.=lower
(没有括号)会发生什么?似乎=
要求其右参数在语法上仅限于单个函数调用(将被解释为方法调用)。这与任何现有Python运算符都有很大不同
处理所有这些问题的唯一方法似乎是缩小建议的范围,使其实际上只接受右侧的单个函数调用,并使其不可自定义,从而使
x.=method(…)
成为x=x.method(…)的纯语法糖
。但是,如上所述,这比当前的扩充任务所允许的要弱得多,所以我认为这不会是一个大的胜利。不,这不是possible@ingvar解释?通过+=
应用操作和赋值是一种错误。数字和字符串的行为不同,+
运算符具有不同的含义当应用于不同的上下文时。@alfasin:它不仅仅是语法上的糖分。它也是一个优化的机会。\uuuuuu igettr\uuuuuu
?