Для чтения не имеет значения, какой вы используете - self.BAR
и MyClass.BAR
синтаксически эквивалентны, если у вас нет иерархии классов, где подкласс переопределяет значение BAR
.
Для записиОни не то же самое.Запись в self.BAR
эффективно создаст новую переменную, которая является локальной для экземпляра объекта self
, поэтому любые чтения из self.BAR
из другого экземпляра объекта не увидят изменений.Это может быть довольно ужасно для отладки, потому что из кода не очевидно, что должно произойти, потому что он чувствителен к синхронизации.определенный уровень в иерархии классов, или type(self).BAR
или self.__class__.BAR
, если вы хотите что-то, что безопасно для наследования.Это определенно и очевидно переменная класса, позволяющая избежать проблемы, описанной выше, с динамическими псевдонимами, возникающими во время выполнения.Использование self
просто печет в некоторой хрупкости, что может быть трудно обнаружить в будущем.