Это может иметь больше смысла для вас, если вы замените ссылки на self.cols
и self.table
на self.__class__.cols
и self.__class__.table
. Эта путаница вызвана доступом к атрибутам класса через объект self
, как будто они являются атрибутами экземпляра, и почему мне не особенно нравится эта идиома кодирования. При взгляде на код в __init__
, где атрибутам экземпляра обычно присваиваются их значения, становится неприятно сразу увидеть утверждение, что читает значение self.cols
- где, черт возьми, self.cols
получает инициализирован ?! С другой стороны, если вы измените это утверждение на:
assert len(data)==len(self.__class__.cols)
тогда становится понятнее, что ожидается, что список значений данных будет той же длины, что и определенный список столбцов для этого экземпляра DataRow. Атрибут класса cols
инициализируется сразу после определения класса в следующем выражении:
DataRow.cols = cols.split()
задолго до того, как будет создан какой-либо экземпляр - вот почему этот утверждение работает.
Автор этого кода может рассмотреть возможность преобразования в более актуальную namedtuple
конструкцию.