Подальше відлуння поради Майка та Алекса та додавання мого власного кольору ...
Використання атрибутів екземпляра є типовим ... більш ідіоматичним Python. Атрибути класу використовуються не так сильно, оскільки випадки їх використання є специфічними. Те саме стосується статичних та класових методів порівняно з "нормальними" методами. Це спеціальні конструкції, що стосуються конкретних випадків використання, інакше це код, створений непристойним програмістом, який хоче показати, що вони знають якийсь незрозумілий куточок програмування Python.
У своїй відповіді Алекс зазначає, що доступ буде (трохи) швидшим завдяки одному меншому рівню пошуку ... Дозвольте мені уточнити для тих, хто ще не знає, як це працює. Він дуже схожий на змінний доступ - порядок пошуку якого:
- місцеві жителі
- нелокальні
- глобалів
- вбудовані
Для доступу до атрибутів порядок:
- екземпляр
- клас
- базові класи, визначені MRO (порядок роздільної здатності методу)
Обидві методи працюють "зсередини", тобто більшість локальних об'єктів перевіряються спочатку, потім зовнішні шари перевіряються послідовно.
У вашому прикладі вище, скажімо, ви шукаєте path
атрибут. Коли він зустрічає посилання типу " self.path
", Python спочатку розгляне атрибути екземпляра для відповідності. Коли це не вдається, він перевіряє клас, з якого об'єкт був створений. Нарешті, він шукатиме базові класи. Як зазначив Алекс, якщо ваш атрибут знайдений в екземплярі, його не потрібно шукати в іншому місці, отже, і ваша невелика економія часу.
Однак якщо ви наполягаєте на атрибутах класу, вам потрібен додатковий пошук. Або іншою вашою альтернативою є посилання на об'єкт через клас замість екземпляра, наприклад, MyController.path
замість self.path
. Це прямий пошук, який обійде відкладений пошук, але, як згадує Алекс нижче, це глобальна змінна, і ви втрачаєте той біт, який ви думали, що збираєтеся зберегти (якщо ви не створите локальну посилання на ім'я [глобального] класу ).
Суть полягає в тому, що ви повинні використовувати атрибути екземплярів більшу частину часу. Однак трапляться випадки, коли атрибут класу є правильним інструментом для роботи. Код, використовуючи обидва одночасно, вимагатиме максимальної ретельності, оскільки використання self
лише отримує об’єкт атрибута екземпляра та тініє доступ до однойменного атрибута класу. У цьому випадку для використання посилання на нього потрібно використовувати атрибут доступу за назвою класу.