问题描述
我正在尝试实现特殊行为,以便 self 和 self.aux_gate 中的值始终相同。我尝试通过实现 __setattr__()
来做到这一点,但在这样做的过程中,我遇到了许多关于 __dict__
的问题。
据我所知,似乎每当 self.__setattr__()
被正常调用时,它都会向 self.__dict__
添加一个键值对,对应于参数 self.__setattr__()
给出。>
然而,我编写的 self.__setattr__()
似乎创建了额外的 self.__dict__
条目,我见过 self.__dict__["conditional"]
、self.__dict__["current_Position"]
和 self.__dict__["current_Track"]
。我看不出这些值是如何进入 self.__dict__
的。
这里是类,我已经复制并粘贴了下面的超类
class SWAP_Gate(Quantum_Gate):
def __init__(self,cost,conditional,current_Track,current_Position,rectangle = None,aux_gate = None):
if aux_gate is None:
self.aux_gate = SWAP_Gate(cost,aux_gate = self)
else:
self.aux_gate = aux_gate
self.cost = cost
self.__SWAPconditional = conditional
self.__SWAPcurrent_Track = current_Track
self.__SWAPcurrent_Position = current_Position
if rectangle is None:
self.rectangle = pg.Rect(430,1480,150)
else:
self.rectangle = rectangle
def __setattr__(self,name,value):
super(SWAP_Gate,self).__setattr__(name,value)
if name == "conditional":
self.aux_gate.conditional = value
#I've deleted some code on this line that jsut made the whole post a lot harder to read,it's not relevant to my problem
elif name == "current_Position":
self.current_Position = value
self.aux_gate.current_Position = value
elif name == "aux_gate":
self.__dict__["aux_gate"] == value
else:
self.__dict__[name] == value
def __getattr__(self,name):
if name == "conditional":
return self.__SWAPconditional
elif name == "current_Track":
return self.__SWAPcurrent_Track
elif name == "current_Position":
return self.__SWAPcurrent_Position
class Quantum_Gate():
def __init__(self,rectangle = None):
self.cost = cost
self.conditional = conditional
self.current_Track = current_Track
self.current_Position = current_Position
if rectangle is None:
self.rectangle = pg.Rect(0,100,100)
else:
self.rectangle = rectangle```
解决方法
我看到的主要内容是 __setattr__
函数中的第一条语句是
super(SWAP_Gate,self).__setattr__(name,value)
除了您在 __setattr__
中拥有的任何其他代码之外,此语句将导致默认 setattr 行为发生,因此在 __dict__
中看到“current_Track”是预期的任何时间 current_Track
设置(除非 SWAP_Gate 的超类阻止了 setattr) 的默认行为。
如果您不希望发生这种默认行为,请删除 __setattr__
顶部的 super() 语句,并在最后的 else 语句中用它替换 self.__dict__
语句:>
def __setattr__(self,name,value):
# Removed super() statement from here
if name == "conditional":
self.aux_gate.conditional = value
elif name == "current_Track":
if self.current_Track:
#...
elif name == "aux_gate":
self.__dict__["aux_gate"] == value
else:
#replaced self.__dict__[name]=value with super() statement:
super(SWAP_Gate,value)