我想在Python中实现3D矢量,将其组件存储在numpy数组(或其他容器)中。我希望以x
,y
和z
的形式访问这些组件,以便获取和设置它们。最好的方法是什么?
我实现了这样:
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的解决方案。
答案 0 :(得分:3)
好的,评论部分似乎有限,所以我会搬到这里......
这是我按优先顺序排列的:
if key in self.components
线性搜索组件x
(或其他)的方式。也许这是可行的:
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())
self._data[components[key]]
是我们必须忍受的东西! :d 如果try
失败,您可以添加catch
和super()
来访问return self._data[components[key]]
的数据!