如何获取和设置类的数据属性?

时间:2017-11-28 20:44:21

标签: python python-3.x numpy

我想在Python中实现3D矢量,将其组件存储在numpy数组(或其他容器)中。我希望以xyz的形式访问这些组件,以便获取和设置它们。最好的方法是什么?

我实现了这样:

import numpy as np

class Vector3d:
    components = ['x', 'y', 'z']

    def __init__(self):
        self._data = np.array([0.0, 0.0, 0.0])

    def __getattr__(self, key):
        if key in self.components:
            index = self.components.index(key)
            return self._data[index]
        else:
            return super().__getattr__(key)

    def __setattr__(self, key, value):
        if key in self.components:
            index = self.components.index(key)
            self._data[index] = value
        else:
            return super().__setattr__(key, value)

    def __repr__(self):
        return repr(self._data)

    def norm(self):
        return np.linalg.norm(self._data)

a = Vector3d()
a.x = 1.2
a.y = 2.3
a.z = 3.4
print(a.x, a.y, a.z)
print(a)
print(a.norm())

我不喜欢它。首先,我复制了代码if key in self.components: index = self.components.index(key)。其次,每次搜索索引似乎对消耗时间都不是最优的。我相信有更好的方法来实现它。请告诉我你的方法。

我正在寻找Python 3的解决方案。

1 个答案:

答案 0 :(得分:3)

好的,评论部分似乎有限,所以我会搬到这里......

这是我按优先顺序排列的:

  1. 您不喜欢if key in self.components线性搜索组件x(或其他)的方式。
  2. 你不喜欢那段重复的代码。
  3. 也许这是可行的:

    import numpy as np
    
    class Vector3d:
        components = {'x':0, 'y':1, 'z':2}
    
        def __init__(self):
            self._data = [0.0, 0.0, 0.0]
    
        def __getattr__(self, key):
            return self._data[components[key]] ###!!!
    
        def __setattr__(self, key, value):
            self._data[components[key]] = value ###!!!
    
        def __repr__(self):
            return repr(self._data)
    
        def norm(self):
            return np.linalg.norm(self._data)
    
    a = Vector3d()
    a.x = 1.2
    a.y = 2.3
    a.z = 3.4
    print(a.x, a.y, a.z)
    print(a)
    print(a.norm())
    
    1. 搜索现在不是线性的,所以它比你写的更优化。
    2. 多行重复代码现已消失,但self._data[components[key]]是我们必须忍受的东西! :d
    3. 如果try失败,您可以添加catchsuper()来访问return self._data[components[key]]的数据!