Повторяя совет Майка и Алекса и добавляя свой собственный цвет ...
Использование атрибутов экземпляра является типичным ... более идиоматическим Python. Атрибуты класса используются не так часто, поскольку их варианты использования специфичны. То же самое верно для статических методов и методов класса по сравнению с "обычными" методами. Это специальные конструкции, предназначенные для конкретных случаев использования, иначе это код, созданный ошибочным программистом, желающим показать, что он знает какой-то неясный угол программирования на Python.
Алекс упоминает в своем ответе, что доступ будет (немного) быстрее из-за на один уровень поиска меньше ... позвольте мне еще пояснить для тех, кто еще не знает, как это работает. Это очень похоже на доступ к переменным - порядок поиска:
- местные жители
- nonlocals
- глобалы
- Модульное
Для доступа к атрибутам порядок следующий:
- пример
- класс
- базовые классы, определенные MRO (порядок разрешения методов)
Оба метода работают «наизнанку», то есть сначала проверяются наиболее локальные объекты, а затем последовательно проверяются внешние слои.
В приведенном выше примере предположим, что вы ищете path
атрибут. Когда он встречает ссылку вроде " self.path
", Python сначала проверяет атрибуты экземпляра на соответствие. Когда это не удается, он проверяет класс, из которого был создан объект. Наконец, он будет искать базовые классы. Как заявил Алекс, если ваш атрибут найден в экземпляре, его не нужно искать в другом месте, что позволяет сэкономить немного времени.
Однако, если вы настаиваете на атрибутах класса, вам понадобится дополнительный поиск. Или ваша другая альтернатива - ссылаться на объект через класс вместо экземпляра, например, MyController.path
вместо self.path
. Это прямой поиск, который позволяет обойти отложенный поиск, но, как упоминает ниже Алекс, это глобальная переменная, поэтому вы теряете тот бит, который, как вы думали, собирались сохранить (если вы не создадите локальную ссылку на [глобальное] имя класса ).
Суть в том, что вы должны использовать атрибуты экземпляра большую часть времени. Тем не менее, будут случаи, когда атрибут класса является правильным инструментом для работы. Код, использующий и то, и другое одновременно, потребует наибольшего усердия, потому что при использовании self
вы получите только объект атрибута экземпляра и затеняет доступ к атрибуту класса с тем же именем. В этом случае вы должны использовать атрибут доступа по имени класса, чтобы ссылаться на него.