NameError: имя класса, не определенного внутри самого класса - python - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий код:

import numpy as np

class ClassProperty(property):
    def __get__(self, cls, owner):
        return self.fget.__get__(None, owner)()

def coord(cls, c):
    if cls.dimension <= 2:
        return c
    else:
        return c + [0]*(cls.dimension-2)

class Basis_NonI(object):

    @ClassProperty
    @classmethod
    def zerocoord(cls):
        return coord(cls, [0,0])   

    def __init__(self, dimension):
        pass

class Basis_D(Basis_NonI):
    dimension = 2
    proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
    def __init__(self, dimension):
        super(Basis_D, self).__init__(Basis_D.dimension)

, где я хочу, чтобы dimension и proj_matrix были атрибутами класса Basis_D.

Когда я его запускаю,появляется следующая ошибка:

proj_matrix = np.array ([Basis_D.zerocoord, Basis_D.zerocoord])

NameError: имя 'Basis_D' не определено

-

Чего я не понимаю, так это того, что я могу использовать Basis_D.dimension в init, так почему он не пересчитывает имя Basis_D, когда я использую его для определения proj_matrix

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Basis_D создается, как только все операторы внутри него выполняются и достигают конца.Вы можете проверить это, используя словарь globals ().

class Basis_D(Basis_NonI):
dimension = 2
print('Basis_D got created?:',bool(globals().get('Basis_D')))
#proj_matrix = np.array([Basis_D.zerocoord, Basis_D.zerocoord])
def __init__(self, dimension):
    super(Basis_D, self).__init__(Basis_D.dimension)

print('Basis_D got created?:',bool(globals().get('Basis_D')))

=================== RESTART: D:/PythonWorkspace/sometry.py ===================
Basis_D got created?: False
Basis_D got created?: True
0 голосов
/ 19 октября 2018

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...