Python是一种可以使用以下语言的语言:
>>> class A(object):
... def __eq__(self, _):
... return True
...
>>> a = A()
>>> a == "slfjghsjdfhgklsfghksjd"
True
>>> a == -87346957234576293847658734659834628572384657346573465
True
>>> a == None
True
>>> a is None
False
其他内容,例如gt
和lt
也以这种方式过载" 1 ,在我看来这是一个很棒的功能
我很好奇=
赋值运算符是否也是"可过载" 1 以类似的方式,或者如果我是必须将Python重新编译为NotPython才能执行此操作。
(据我所知,类和对象不实现某些__assign__
方法;这是用C字节码运行器/编译器实现的。)
具体来说,我想通过迭代一个令牌列表without using an iterator来实现一个LL( k )解析器,以便我可以任意改变迭代器的索引以跳转到给定的令牌。
问题是,在循环的给定周期中,如果我已经任意修改了索引以准备下一个周期(我肯定会做很多事情) last < / em>我想做的事情就是通过添加一个变量来搞乱这个变量,就好像它没有被改变一样。
对此最简单,最简单的解决方案可能是在跳转时设置一个标志,并在每个周期重置为False
,但这会引入微小的隐藏错误我想要提前避免。 (See here for what I mean -- this is the pathetic iterative LL(1) parser I'm rewriting, and I want its reincarnation to be somewhat maintainable and/or readable。)
旗帜解决方案:
idx = 0
while True:
jmpd = False
# maybe we jumped, maybe we didn't; how am I to know!?!?
if jmpd == False:
idx += 1
大!一个很大的缺点:在每个可能的分支导致索引的任意改变,我必须设置该标志。也许是琐碎的(显然在这个例子中),但对我来说,它似乎是一个难以理解的,错误友好的代码的预兆。
在不使用第二个变量的情况下,最好的方法是测试某个值是否随时间发生变化?
如果您的答案是,&#34;没有,只要保持安静并使用标志变量&#34;,那么我祝贺您推广不良代码设计。 / S
1 是的,我知道它不是技术上运算符重载;你有一个更好,更容易理解的术语吗?
答案 0 :(得分:2)
您可以使用其他magic method拦截属性的分配。它被称为__setattr__()
。以下是如何使用它的示例:
In [2]: class Test(object):
def __setattr__(self, name, value):
print(name, "changed to", value)
super().__setattr__(name, value)
...:
In [3]: t = Test()
In [4]: t.name = 4
name changed to 4
In [5]: t.name = 5
name changed to 5