Мое решение Вашей проблемы было бы к также:
1 - используют интервал вместо перечислений: Объявите свой ints в анонимном пространстве имен в Вашем файле CPP (не в заголовке):
namespace
{
const int FUNCTIONALITY_NORMAL = 0 ;
const int FUNCTIONALITY_RESTRICTED = 1 ;
const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
}
, Поскольку Ваши методы являются частными, никто не смешает с данными. Вы могли даже пойти далее, чтобы протестировать, если кто-то отправляет Вам недопустимые данные:
namespace
{
const int FUNCTIONALITY_begin = 0 ;
const int FUNCTIONALITY_NORMAL = 0 ;
const int FUNCTIONALITY_RESTRICTED = 1 ;
const int FUNCTIONALITY_FOR_PROJECT_X = 2 ;
const int FUNCTIONALITY_end = 3 ;
bool isFunctionalityCorrect(int i)
{
return (i >= FUNCTIONALITY_begin) && (i < FUNCTIONALITY_end) ;
}
}
2: создайте полный класс с ограниченными инстанцированиями константы, как сделанный в Java. Вперед объявите класс, и затем определите его в файле CPP и instanciate только подобные перечислению значения. Я сделал что-то как этот в C++, и результат столь не удовлетворял, как желаемый, поскольку требовался некоторый код для моделирования перечисления (конструкция копии, оператор =, и т.д.).
3: Как предложено прежде, используйте конфиденциально заявленное перечисление. Несмотря на факт пользователь будет видеть его полное определение, он не будет в состоянии использовать его, ни использовать закрытые методы. Таким образом, Вы обычно будете в состоянии изменить перечисление и содержание существующих методов, не нуждаясь в перекомпиляции кода с помощью класса.
Мое предположение было бы любой решением 3 или 1.
Вы можете использовать SVD или QR-разложение для вычисления нулевого пространства линейной системы, например, что-то вроде:
import numpy
def null(A, eps=1e-15):
u, s, vh = numpy.linalg.svd(A)
null_space = numpy.compress(s <= eps, vh, axis=0)
return null_space.T
Это дает для вашего примера:
>>> A
matrix([[-0.75, 0.25, 0.25, 0.25],
[ 1. , -1. , 0. , 0. ],
[ 1. , 0. , -1. , 0. ],
[ 1. , 0. , 0. , -1. ]])
>>> null(A).T
array([[-0.5, -0.5, -0.5, -0.5]])
>>> (A*null(A)).T
matrix([[ 1.66533454e-16, -1.66533454e-16, -2.22044605e-16, -2.22044605e-16]])
См. Также раздел Числовые вычисление пустого пространства в Википедии.