如果我理解正确,那么您实际上是在交换一个类的实例,而不是类。
实例状态保存在两个可能的位置:
__slots__和中
__dict__。如果交换它们,则基本上交换了实例,同时保留了原始名称绑定。一个警告是,该类
不能 是不变的(必须不定义
__hash__()),因为任何已经是集合成员或字典中键的实例都将变得不可检索。
如果是我,我想我应该将.swap()方法改为一个类方法-我认为它将更容易阅读:
class SomeBigClass(): @staticmethod def swap_dict(instance_a, instance_b): instance_a.__dict__, instance_b.__dict__ = instance_b.__dict__, instance_a.__dict__ @classmethod def swap_slot(cls, instance_a, instance_b): values = [] for attr in cls.__slots__: values.append( (attr, getattr(instance_a, attr), getattr(instance_b, attr), )) for attr, val1, val2 in values: setattr(instance_a, attr, val2) setattr(instance_b, attr, val1)
然后再
SomeBigClass.swap_dict(this_instance, other_instance)
要么
SomeBigClass.swap_slot(this_instance, other_instance)
你为什么不这样做呢?如果您有实例绑定到名称,则不应这样做。考虑:
frubbah = SomeBigClass(attr="Hi, Mom!")zikroid = SomeBigClass(attr='Hi, Dad!")SomeBigClass.swap_dict(frubbah, zikroid)
交换之后,您认为自己对zikroid所了解的一切可能都已改变。



