Вы не можете обратиться к MetaDataElement
в то время как он строится, так как он еще не существует. Таким образом,
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!':MetaDataElement.MD_CATEGORY,
'#':MetaDataElement.MD_TAG}
терпит неудачу, потому что само строительство mapInitiator2Type
требует MetaDataElement
иметь атрибуты, которые он еще не имеет. Вы можете представить свои константы MD_INVALID
и т. Д. В качестве переменных, которые являются локальными для построения вашего класса. Поэтому следующие работы, как icktoofay писал:
class MetaDataElement:
(MD_INVALID, MD_CATEGORY, MD_TAG) = range(3)
mapInitiator2Type = {'!': MD_CATEGORY, # MD_CATEGORY is like a local variable!
'#': MD_TAG}
Однако, вы можете обратиться к классу MetaDataElement
в любом еще не-истолковано кусок кода, как в
def method_of_MetaDataElement(self):
print MetaDataElement.MD_TAG
Вы даже есть, ссылаясь на MetaDataElement
, здесь, поскольку MD_TAG
не является своеобразной локальной переменной при выполнении method_of_MetaDataElement()
(MD_TAG
был определен как локальная переменная во время построения класса). Как только класс MetaDataElement
создан, MD_TAG
является просто атрибутом класса, поэтому method_of_MetaDataElement()
должен ссылаться на него как таковой.
Последний пример может быть написан с помощью 'self.MD_TAG', что позволяет избежать необходимости обращаться к классу имя. – Marcin
@Marcin: 'self.MD_TAG' также является возможностью, но это не эквивалентно' MetaDataElement.MD_TAG', если 'MetaDataElement' является подклассом (подклассы могут перезаписывать' MD_TAG'). Оба действительны, но выбор один зависит от ситуации. – EOL
Честно говоря, я думаю, что, вероятно, неправильно использовать методы, чтобы запретить подклассам возможность с пользой изменять членов класса, поэтому я бы рекомендовал использовать 'self', если только для этого не существует конкретной причины. – Marcin