class
- исполняемый оператор.Когда модуль впервые импортируется (для данного процесса), весь код на верхнем уровне оператора class
выполняется, все имена, определенные таким образом, собираются в dict, затем объект class
создается сэтот дикт и, наконец, привязанный к имени класса.Итак, на данный момент:
class Basis_D(Basis_NonI):
dimension = 2
# HERE
proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
класс еще не создан и не связан с именем Basis_D
.
Теперь, когда вызывается __init__
, класс уже создан и привязан к имени уровня модуля Basis_D
, поэтому имя может быть разрешено.
FWIW, выне должен напрямую ссылаться на Basis_D
в ваших методах, но type(self)
(или даже self
- если имя не разрешено как атрибут экземпляра, оно ищется в классе).
Также,почему вы настаиваете на использовании атрибутов класса?Вы понимаете, что ваш массив project_matrix
будет использоваться всеми экземплярами Basis_D
?