函数(属性)python的函数

函数(属性)python的函数,python,numpy,Python,Numpy,我有一个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 lo

我有一个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

如果您真的希望
xcoords
返回
numpy
数组,那么人们可能不希望
xcoords
的值在方法中具有
mm
。您应该考虑
mm
in
是否真的是数组本身的属性,或者它们是否是您定义的类的属性。在后一种情况下,我建议不要子类化
ndarray
——只需将它们定义为包含类的方法即可

另一方面,如果这些确实是
xcoords
返回的对象的属性,那么子类化
ndarray
是一种合理的方法。如前所述,通过定义
\uuuuu new\uuuuu
\uuuu array\u finalize\uuuuuuu
确保操作正确

判断是否应该子类<代码> NDARRAY,您可能会考虑是否可以在程序的其他地方重用该类。(您现在实际上不必在其他地方使用它——您只需要能够看到自己在某个时候重用它。)如果不能,那么这些可能是包含类的属性。这里的推理思路是——从函数的角度思考——如果你有一个短函数

foo
和一个短函数
bar
,并且知道你永远不会用除了
foo(bar(x))
以外的任何方式调用它们,那么你最好还是写
foo\u bar
。同样的逻辑也适用于类


最后,正如larsmans指出的,
中的
是python中的一个关键字,因此在本例中不可用(这就是我在上面的
中使用
的原因)。

如果您真的希望
xcoords
返回
numpy
数组,然后人们可能不希望
xcoords
的值具有
mm
in_uz
方法。您应该考虑
mm
in
是否真的是数组本身的属性,或者它们是否是您定义的类的属性。在后一种情况下,我建议不要子类化
ndarray
——只需将它们定义为包含类的方法即可

另一方面,如果这些确实是
xcoords
返回的对象的属性,那么子类化
ndarray
是一种合理的方法。如前所述,通过定义
\uuuuu new\uuuuu
\uuuu array\u finalize\uuuuuuu
确保操作正确

判断是否应该子类<代码> NDARRAY,您可能会考虑是否可以在程序的其他地方重用该类。(您现在实际上不必在其他地方使用它——您只需要能够看到自己在某个时候重用它。)如果不能,那么这些可能是包含类的属性。这里的推理思路是——从函数的角度思考——如果你有一个短函数

foo
和一个短函数
bar
,并且知道你永远不会用除了
foo(bar(x))
以外的任何方式调用它们,那么你最好还是写
foo\u bar
。同样的逻辑也适用于类


最后,正如larsmans指出的,
中的
是python中的一个关键字,因此在本例中不可用(这就是我在上面的
中使用
的原因)。

如果您实际从
\u read\u coords
返回一个值,这应该按原样工作。

您怎么理解“原样”呢,在何处/以何种方式实现mm/in函数?使
xcoords
成为一个类的实例,该类的属性
mm
in
是使用
@property
定义的。看起来您需要将
mm
和'in'的属性添加到返回的numpy数组中,通过对numpy数组类型进行子类化,或者在返回前将它们添加到实例对象中。如果可能,我希望保留
xcoords
一个numpy数组。“在返回对象之前将其添加到对象中”是什么意思?如果您实际从
\u read\u coords
返回值,则应按原样操作。您如何理解“按原样”呢,在何处/以何种方式实现mm/in函数?使
xcoords
成为一个类的实例,该类的属性
mm
in
是使用
@property
定义的。看起来您需要将
mm
和'in'的属性添加到返回的numpy数组中,通过对numpy数组类型进行子类化,或者在返回前将它们添加到实例对象中。如果可能,我希望保留
xcoords
一个numpy数组。“在返回对象之前将它们添加到对象中”是什么意思?我不认为您对是否子类化的测试是确定的。子类化仅仅意味着基类的专门化。所有子类实例也是基类的实例,因此不会丢失任何东西,其他只知道基类的代码应该能够很好地使用它们。有什么不同,它会让你在某个时候重用课堂吗?@马蒂诺,我同意它不是决定性的——它只是一个建议(“你可能会考虑……”)。判断你是在创建一个有用的新类,还是在创建一个无用的杂乱类,这更像是一个粗略的启发。如果你真的在使用它,我看不出它怎么可能是无用的。在我看来,类似这样的东西是子类化的一种完全有效的用法。我不认为你对是否子类化的测试是确定的。子类化仅仅意味着基类的专门化。所有子类实例也是基类的实例,因此不会丢失任何内容,其他代码只知道基类