0

我有一个 Python 类,其函数和属性如下:

@property
def xcoords(self):
    ' Returns numpy array. '
    try:
        return self.x_coords
    except:
        self.x_coords = self._read_coords('x')
        return self.x_coords

def _read_coords(self, type):
    # read lots of stuff from big file
    return array

这使我可以这样做:data.xcoords,又好又简单。

我想保持原样,但是我想定义允许我这样做的函数:

    data.xcoords.mm
    data.xcoords.in

我该怎么做?我还希望这些函数适用于类的其他属性,例如data.zcoords.mm.

4

1 回答 1

3

如果你真的想xcoords返回一个numpy数组,那么人们可能不会期望xcoords拥有mmin_方法的值。您应该考虑是否mm并且in_真的是数组本身的属性,或者它们是否是您正在定义的类的属性。在后一种情况下,我建议不要子类ndarray化——只需将它们定义为包含类的方法。

另一方面,如果这些肯定是由返回的事物的属性xcoords,那么子类ndarray化是一种合理的方法。确保通过定义__new__并按照文档中的__array_finalize__讨论来正确处理。

要决定是否应该 subclass ndarray,您可能会考虑是否可以看到自己在程序的其他地方重用这个类。(你现在实际上不必在其他地方使用它——你只需要能够看到自己在某个时候重用它。)如果你不能,那么这些可能是包含类的属性。这里的推理思路是——从函数的角度思考——如果你有一个短函数foo和一个短函数bar,并且知道你永远不会以任何其他方式调用它们foo(bar(x)),那么你最好改写foo_bar。同样的逻辑也适用于类。

最后,正如 larsmans 所指出的,in是 python 中的一个关键字,因此在这种情况下不能使用(这就是我在in_上面使用的原因)。

于 2012-07-23T10:07:36.470 回答