我有一些使用__reduce__
挑选的类实例。这些类具有我在另一个数组中收集的成员。我需要挑选这个数组,但我无法找到正确的方法。
只是为了澄清事情,想象我有代表方形,矩形和圆形的类。我创建了一些实例:
A=Square(10)
B=Rectangle(5,10)
C=Circle(6)
我可以挑选名单
classes=[A, B, C]
但我需要一种方法来挑选这个类实例属性数组
dimensions=[A.side, B.y, C.diameter]
保持对原始对象的引用,以便在一个对象更改相对属性更改时:假设我调用C.grow(2)
我希望dimensions[2]=12
。
为了解决这个问题,我现在挑选这本词典:
d={ classes: [A, B, C],
dimensions: [(A,'side'), (B,'y'), (C,'diameter')] }
但我认为这是一个非常糟糕的解决方案。
我感谢任何建议。
答案 0 :(得分:1)
如果你有像A.side
这样的东西,那么保持对象原始引用的唯一方法就是将它保存在列表或它自己的类中。
例如,您可以这样做:
class Value:
def __init__(self, val):
self.value = val
现在,您可以Square
,Rectangle
和Circle
,以便他们为每个变量使用类Value
。
class Square:
def __init__(self, side_length):
self.side = Value(side_length)
然后在dimensions = [A.side, ...]
注意,现在A.side是一个类 - 使用print(A.side)
无法看到该值,但可以使用print(A.side.value)
答案 1 :(得分:0)
我出来了这个解决方案:
class AttributeWrapper(object):
def __init__(self, obj, attribute):
object.__setattr__(self, 'ref_obj', obj)
object.__setattr__(self, 'ref_attribute', attribute)
def __getattr__(self,attr):
return object.__getattribute__(self,'ref_obj').__getattribute__(object.__getattribute__(self,'ref_attribute')).__getattribute__(attr)
def __setattr__(self,attr,value):
object.__getattribute__(self,'ref_obj').__getattribute__(object.__getattribute__(self,'ref_attribute')).__setattr__(attr,value)
return value
我不认为这是理想的解决方案,但至少,使用它我不必更改其他类(示例中的Square,Rectangle,Circle)。
谢谢大家的帮助。