class ValueKeeper(object):
def __init__(self, value): self.value = value
def __str__(self): return str(self.value)
class A(ValueKeeper):
def __pos__(self):
print 'called A.__pos__'
return B(self.value - 3)
class B(ValueKeeper):
def __pos__(self):
print 'called B.__pos__'
return A(self.value + 19)
x = A(430)
print x, type(x)
print +x, type(+x)
print ++x, type(++x)
print +++x, type(+++x)
8
Python没有这些运算符,但如果你真的需要它们,你可以编写一个具有相同功能的函数 .
def PreIncrement(name, local={}):
#Equivalent to ++name
if name in local:
local[name]+=1
return local[name]
globals()[name]+=1
return globals()[name]
def PostIncrement(name, local={}):
#Equivalent to name++
if name in local:
local[name]+=1
return local[name]-1
globals()[name]+=1
return globals()[name]-1
用法:
x = 1
y = PreIncrement('x') #y and x are both 2
a = 1
b = PostIncrement('a') #b is 1 and a is 2
x = 1
def test():
x = 10
y = PreIncrement('x') #y will be 2, local x will be still 10 and global x will be changed to 2
z = PreIncrement('x', locals()) #z will be 11, local x will be 11 and global x will be unaltered
test()
您还可以使用以下功能:
x = 1
print(PreIncrement('x')) #print(x+=1) is illegal!
但在我看来,以下方法更加清晰:
x = 1
x+=1
print(x)
减少运营商:
def PreDecrement(name, local={}):
#Equivalent to --name
if name in local:
local[name]-=1
return local[name]
globals()[name]-=1
return globals()[name]
def PostDecrement(name, local={}):
#Equivalent to name--
if name in local:
local[name]-=1
return local[name]+1
globals()[name]-=1
return globals()[name]+1
6 回答
++
不是运营商 . 这是两个+
运营商 .+
运算符是 identity 运算符,它什么都不做 . (澄清:+
和-
一元运算符只适用于数字,但我认为你不会指望一个假设的++
运算符来处理字符串 . )解析为
这转化为
您必须使用稍长的
+=
运算符来执行您想要执行的操作:我怀疑
++
和--
运营商因为一致性和简单性而被排除在外 . 我不知道Guido van Rossum给出的确切论据,但我可以想象一些论点:更简单的解析 . 从技术上讲,解析
++count
是不明确的,因为它可能是+
,+
,count
(两个一元+
运算符),就像++
,count
(一个一元++
运算符)一样容易 . 这不是一个重要的句法歧义,但确实存在 .更简单的语言 .
++
只不过是+= 1
的同义词 . 这是一个发明的简写,因为C编译器是愚蠢的,并且不知道如何优化a += 1
到大多数计算机的inc
指令 . 在优化编译器和字节码解释语言的这一天,向一种语言添加运算符以允许程序员优化其代码通常是不受欢迎的,特别是在像Python这样设计为一致且可读的语言中 .令人困惑的副作用 . 使用
++
运算符的语言中的一个常见新手错误是混合了增量前/减值运算符之间的差异(优先级和返回值),Python喜欢消除语言"gotcha" -s . pre-/post-increment in C的pre-/post-increment in C非常毛茸茸,非常容易搞砸 .虽然其他答案是正确的,只要它们显示通常只是
+
(即,保留数字,如果它是一个),它们是不完整的,因为他们不解释会发生什么 .确切地说,
+x
评估为x.__pos__()
,++x
评估为x.__pos__().__pos__()
.我可以想象一个非常奇怪的类结构(儿童,不要在家里这样做!)像这样:
Python没有这些运算符,但如果你真的需要它们,你可以编写一个具有相同功能的函数 .
用法:
在函数内部,如果要更改局部变量,则必须添加locals()作为第二个参数,否则它将尝试更改全局变量 .
您还可以使用以下功能:
但在我看来,以下方法更加清晰:
减少运营商:
我在我的模块中使用这些函数将javascript转换为python .
Wikipedia
因此,通过引入这样的运算符,您将破坏表达式/语句拆分 .
出于同样的原因你不能写
正如你可以在其他语言中那样,不保留这种区别 .
是的,我错过了 - 功能也是如此 . 几百万行的c代码在我的老头脑中刻上了那种想法,而不是对抗它......这是我练习的一个类:
这是'tis:
您可以像这样使用它:
......已经有了c,你可以这样做......
....要不就...
...并且(重新)分配到整数...
...虽然这将维持c作为类型计数器:
编辑:
And then there's this bit of unexpected (and thoroughly unwanted) behavior ,
...因为在该元组内部, getitem ()不是使用的,而是将对象的引用传递给格式化函数 . 叹 . 所以:
...或者,更详细,更明确地说明了我们实际想要发生的事情,尽管以实际形式反复表示冗长(使用
c.v
代替)......如果要增加或减少,通常需要对整数执行此操作 . 像这样:
但在Python中,整数是 immutable . 那就是你无法改变它们 . 这是因为整数对象可以在多个名称下使用 . 试试这个:
上面的a和b实际上是同一个对象 . 如果你增加了a,你也会增加b . 那不是你想要的 . 所以你必须重新分配 . 像这样:
或者更简单:
哪个会将
b
重新分配给b+1
. 这不是增量运算符,因为它不会递增b
,而是重新分配它 .简而言之:Python在这里表现不同,因为它不是C,并且不是机器代码的低级包装器,而是高级动态语言,其中增量没有意义,并且也不像C中那样必要例如,每次有循环时都使用它们 .