Тип переменных в классе: лучшие практики программирования
Я определяю класс, как показано ниже:
import numpy as np
class Vector:
def __init__(self, v):
self.v = v
Я могу создать экземпляр класса, выполнив следующие действия:
p1 = np.array([0.0, 0.0, 0.0])
v1 = Vector(p1)
v2 = Vector(3)
Я хочу, чтобы Vector всегда содержал вектор в трехмерном пространстве. Но как правильно использовать Python, чтобы Vector всегда был 3-компонентным вектором?
2 ответа
Вы можете сделать это двумя способами, которые можно использовать одновременно. Во-первых, во время выполнения:
class Vector:
def __init__(self, v):
if not isinstance(v, np.ndarray) or v.shape != (3,):
raise ValueError("vector must be 3-dimensional array")
self.v = v
Подобные проверки типов в значительной степени являются стандартным соглашением в python. Тем не менее, с Python 3.5+ typing
Был добавлен модуль, который позволяет использовать так называемые "подсказки типов", которые могут быть статически проанализированы вашей IDE или линтером:
class Vector:
def __init__(self, v: np.ndarray[float, shape=(3,)]):
self.v = v
Однако подсказка типа еще не полностью реализована для numpy (приведенный выше синтаксис предварительный), см. Эту проблему с отслеживанием на GitHub.
Не уверен, что это лучший способ сделать это, но наверняка это один из способов. Вы можете проверить с помощью следующего кода:
import numpy as np
class Vector:
def __init__(self, v):
if isinstance(v, np.ndarray) and v.size == 3:
self.v = v
else:
raise ValueError('param is not an Array in the 3D space')