Nei*_*l G 6 python numpy python-3.x python-descriptors
我想在返回代理对象的类上创建某种描述符.索引时,代理对象检索对象的成员并将索引应用于它们.然后它返回总和.
例如,
class NDArrayProxy:
    def __array__(self, dtype=None):
        retval = self[:]
        if dtype is not None:
            return retval.astype(dtype, copy=False)
        return retval
class ArraySumProxy(NDArrayProxy):
    def __init__(self, arrays):
        self.arrays = arrays
    @property
    def shape(self):
        return self.arrays[0].shape
    def __getitem__(self, indices):
        return np.sum([a[indices]
                       for a in self.arrays],
                      axis=0)
当我将实际数组作为成员变量时,此解决方案工作正常:
class CompartmentCluster(Cluster):
    """
    Base class for cluster that manages evidence.
    """
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.variable_evidence = ArraySumProxy([])
class BasicEvidenceTargetCluster(CompartmentCluster):
    # This class variable creates a Python object named basic_in on the
    # class, which implements the descriptor protocol.
    def __init__(self,
                 *,
                 **kwargs):
        super().__init__(**kwargs)
        self.basic_in = np.zeros(self.size)
        self.variable_evidence.arrays.append(self.basic_in)
class ExplanationTargetCluster(CompartmentCluster):
    """
    These clusters accept explanation evidence.
    """
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.explanation_in = np.zeros(self.size)
        self.variable_evidence.arrays.append(self.explanation_in)
class X(BasicEvidenceTargetCluster, ExplanationTargetCluster):
    pass
现在我已经将我的数组更改为Python描述符(cluster_signal实现描述符协议返回一个numpy数组):
class CompartmentCluster(Cluster):
    """
    Base class for cluster that manages evidence.
    """
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.variable_evidence = ArraySumProxy([])
class BasicEvidenceTargetCluster(CompartmentCluster):
    # This class variable creates a Python object named basic_in on the
    # class, which implements the descriptor protocol.
    basic_in = cluster_signal(text="Basic (in)",
                              color='bright orange')
    def __init__(self,
                 *,
                 **kwargs):
        super().__init__(**kwargs)
        self.variable_evidence.arrays.append(self.basic_in)
class ExplanationTargetCluster(CompartmentCluster):
    """
    These clusters accept explanation evidence.
    """
    explanation_in = cluster_signal(text="Explanation (in)",
                                    color='bright yellow')
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.variable_evidence.arrays.append(self.explanation_in)
class X(BasicEvidenceTargetCluster, ExplanationTargetCluster):
    pass
这不起作用,因为append语句追加描述符调用的结果.我需要的是附加绑定方法或类似代理.修改我的解决方案最好的方法是什么?简而言之:变量basic_in和explanation_in为numpy数组.他们现在是描述符.我想开发一些ArraySumProxy适用于描述符的版本,而不是需要实际的数组.
当您访问描述符时,它会被评估并且您只能获得值。由于您的描述符并不总是返回相同的对象(我猜您不能避免它?),因此您不想在初始化代理时访问描述符。
避免访问它的最简单方法是记住它的名称,因此不要:
self.variable_evidence.arrays.append(self.basic_in)
你做:
self.variable_evidence.arrays.append((self, 'basic_in'))
当然,variable_evidence必须意识到这一点并采取行动getattr(obj, name)才能访问它。
另一种选择是让描述符返回一个稍后评估的代理对象。我不知道你在做什么,但这可能是太多代理的好品味......
编辑
或者...您可以存储吸气剂:
self.variable_evidence.arrays.append(lambda: self.basic_in)
| 归档时间: | 
 | 
| 查看次数: | 165 次 | 
| 最近记录: |