Тип переменных в классе: лучшие практики программирования

Я определяю класс, как показано ниже:

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')
Другие вопросы по тегам