Чи можливі статичні змінні класу в Python?
Чи можна в мові Python мати статичні змінні чи методи класу? Який синтаксис для цього потрібен?
1797
3
Чи можна в мові Python мати статичні змінні чи методи класу? Який синтаксис для цього потрібен?
Змінні, оголошені всередині оголошення класу, але не всередині методу, є класовими або статичними змінними:
Як зазначає @millerdev, це створює змінну рівня класу
i
, але вона відрізняється від будь-якої змінної рівня екземпляраi
, тому ви можете матиЦе відрізняється від C++ та Java, але не дуже відрізняється від C#, де статичний член не може бути доступний за допомогою посилання на екземпляр.
Дивіться що говорить підручник з Python на тему класів та об'єктів класів.
@Steve Johnson вже відповів стосовно статичних методів, що також задокументовано в розділі "Вбудовані функції" в Довіднику бібліотеки Python.
@beidy рекомендує classmethod замість staticmethod, оскільки метод отримує тип класу як перший аргумент, але я все ще не зовсім розумію переваги цього підходу над staticmethod. Якщо ви теж, то це, мабуть, не має значення.
Особисто я використовував би метод класу, коли мені потрібен статичний метод. В основному тому, що я отримую клас в якості аргументу.
або використовуйте декоратор
Для статичних властивостей.. Настав час переглянути визначення змінних у python... Змінні завжди можуть змінюватися. Вони бувають двох типів: змінювані та незмінювані. Також є атрибути класу та атрибути екземпляру. Ніщо так не схоже на статичні атрибути в розумінні java та c++ як статичні атрибути.
Навіщо використовувати статичний метод в пітонічному розумінні, якщо він не має ніякого відношення до класу! На Вашому місці я б або використовував метод класу, або визначав метод незалежним від класу.
Статичні методи у мові python називаються classmethods. Погляньте на наступний код
Зверніть увагу, що при виклику методу myInstanceMethod ми отримуємо помилку. Це тому, що потрібно, щоб метод викликався на екземплярі цього класу. Метод myStaticMethod встановлюється як метод класу з допомогою декоратора @classmethod.
Просто для сміху, ми могли б викликати myInstanceMethod в класі, передавши екземпляр класу, як це зроблено нижче: