使用 self.__setattr__() 时如何不搞乱 self.__dict__ 生成

问题描述

我正在尝试实现特殊行为,以便 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...