我可以"挂钩"变量重新分配?

时间:2016-01-13 01:42:33

标签: python variables

Python是一种可以使用以下语言的语言:

>>> class A(object):
...  def __eq__(self, _):
...   return True
... 
>>> a = A()
>>> a == "slfjghsjdfhgklsfghksjd"
True
>>> a == -87346957234576293847658734659834628572384657346573465
True
>>> a == None
True
>>> a is None
False

其他内容,例如gtlt也以这种方式过载" 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 是的,我知道它不是技术上运算符重载;你有一个更好,更容易理解的术语吗?

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