我有一个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
。
答案 0 :(得分:3)
如果您真的希望xcoords
返回numpy
数组,那么人们可能不希望xcoords
的值具有mm
和in_
方法。您应该考虑mm
和in_
是数组本身的真正属性,还是它们是您定义的类的属性。在后一种情况下,我建议不要对子类ndarray
进行子类化 - 只需将它们定义为包含类的方法。
另一方面,如果这些肯定是xcoords
返回的东西的属性,那么子类化ndarray
是一种合理的方法。请务必按照in the docs所定义的__new__
和__array_finalize__
来做到正确。
要决定是否应该继承ndarray
,您可以考虑是否可以看到自己在程序的其他地方重用此类。 (你实际上 t,那么这些可能是包含类的属性。这里的推理线是 - 根据函数思考 - 如果你有一个简短的函数foo
和一个短函数bar
,并且知道你将从不调用除foo(bar(x))
以外的任何其他方式,你可能最好不要写foo_bar
。同样的逻辑适用于类。
最后,正如larsmans指出的那样,in
是python中的关键字,因此在这种情况下不可用(这就是我上面使用in_
的原因)。