logo

Клас або статичні змінні в Python

Усі об’єкти мають спільні класові або статичні змінні. Екземпляр або нестатичні змінні відрізняються для різних об’єктів (кожен об’єкт має свою копію). Наприклад, нехай студент з інформатики буде представлений класом CSStudent . Клас може мати статичну змінну, значення якої дорівнює cse для всіх об’єктів. І клас також може мати нестатичні члени, наприклад назва і рол .

У C++ і Java ми можемо використовувати статичні ключові слова, щоб зробити змінну змінною класу. Змінні, які не мають попереднього ключового слова static, є змінними екземплярів. Дивіться це для прикладу Java, а це для прикладу C++.



Пояснення:

У Python статична змінна — це змінна, яка є спільною для всіх примірників класу, а не унікальна для кожного примірника. Її також іноді називають змінною класу, оскільки вона належить до самого класу, а не до якогось конкретного екземпляра класу.

Статичні змінні визначені всередині визначення класу, але поза будь-якими визначеннями методів. Зазвичай вони ініціалізуються значенням, як і змінна екземпляра, але до них можна отримати доступ і змінити через сам клас, а не через екземпляр.

Особливості статичних змінних

  • Пам'ять для статичних змінних виділяється один раз, коли об'єкт для класу створюється вперше.
  • Статичні змінні створюються поза методами, але всередині класу
  • Доступ до статичних змінних можна отримати через клас, але не безпосередньо через екземпляр.
  • Поведінка статичних змінних не змінюється для кожного об’єкта.

Підхід Python простий; для нього не потрібне статичне ключове слово.



Примітка: Усі змінні, яким присвоєно значення в в оголошення класу є змінними класу. І змінні що яким присвоюються значення всередині методів, це змінні екземпляра.

іменування для java

приклад:

Python






# Python program to show that the variables with a value> # assigned in class declaration, are class variables> # Class for Computer Science Student> class> CSStudent:> >stream>=> 'cse'> # Class Variable> >def> __init__(>self>,name,roll):> >self>.name>=> name># Instance Variable> >self>.roll>=> roll># Instance Variable> # Objects of CSStudent class> a>=> CSStudent(>'Geek'>,>1>)> b>=> CSStudent(>'Nerd'>,>2>)> print>(a.stream)># prints 'cse'> print>(b.stream)># prints 'cse'> print>(a.name)># prints 'Geek'> print>(b.name)># prints 'Nerd'> print>(a.roll)># prints '1'> print>(b.roll)># prints '2'> # Class variables can be accessed using class> # name also> print>(CSStudent.stream)># prints 'cse'> # Now if we change the stream for just a it won't be changed for b> a.stream>=> 'ece'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'cse'> # To change the stream for all instances of the class we can change it> # directly from the class> CSStudent.stream>=> 'mech'> print>(a.stream)># prints 'ece'> print>(b.stream)># prints 'mech'>

>

>

Вихід

cse cse Geek Nerd 1 2 cse ece cse ece mech>

Вихід:

cse cse Geek Nerd 1 2 cse ece cse ece mech>

приклад:

Python




class> MyClass:> >static_var>=> 0> >def> __init__(>self>):> >MyClass.static_var>+>=> 1> >self>.instance_var>=> MyClass.static_var> obj1>=> MyClass()> print>(obj1.instance_var)># Output: 1> obj2>=> MyClass()> print>(obj2.instance_var)># Output: 2> print>(MyClass.static_var)># Output: 2>

>

>

Вихід

1 2 2>

Пояснення:

у цьому прикладі ми визначаємо клас MyClass, який має статичну змінну static_var, ініціалізовану рівним 0. Ми також визначаємо змінну екземпляра instance_var, унікальну для кожного екземпляра класу.

Коли ми створюємо екземпляр класу (obj1), ми збільшуємо значення статичної змінної на 1 і призначаємо його змінній екземпляра. Коли ми створюємо інший екземпляр класу (obj2), ми знову збільшуємо статичну змінну та призначаємо нове значення змінній екземпляра для цього екземпляра.

Нарешті, ми друкуємо значення статичної змінної, використовуючи сам клас, а не екземпляр класу. Як ви бачите, значення статичної змінної є спільним для всіх екземплярів класу, і воно збільшується кожного разу, коли створюється новий екземпляр.

Статичні змінні можуть бути корисними для підтримки стану в усіх примірниках класу або для обміну даними між усіма примірниками класу. Однак важливо використовувати їх обережно та переконатися, що їхні значення синхронізовані зі станом програми, особливо в багатопоточному середовищі.

Переваги:

    Ефективність пам’яті: оскільки статичні змінні є спільними для всіх екземплярів класу, вони можуть економити пам’ять, уникаючи необхідності створювати кілька копій тих самих даних. Спільний стан: статичні змінні можуть забезпечити спосіб підтримувати спільний стан для всіх примірників класу, дозволяючи всім примірникам отримувати доступ до тих самих даних і змінювати їх. Легкий доступ: до статичних змінних можна отримати доступ за допомогою самої назви класу, не потребуючи примірника класу. Це може зробити більш зручним доступ і зміну даних, що зберігаються в статичній змінній. Ініціалізація: статичні змінні можна ініціалізувати, коли визначено клас, що полегшує впевненість у тому, що змінна має дійсне початкове значення. Читабельність: статичні змінні можуть покращити читабельність коду, оскільки вони чітко вказують, що дані, що зберігаються у змінній, є спільними для всіх екземплярів класу.

Недоліки:

    Негнучкість: статичні змінні можуть бути негнучкими, оскільки їхні значення є спільними для всіх екземплярів класу, що ускладнює наявність різних значень для різних екземплярів. Приховані залежності: статичні змінні можуть створювати приховані залежності між різними частинами коду, що ускладнює розуміння та зміну коду. Безпека потоків: статичні змінні можуть бути проблематичними в багатопоточному середовищі, оскільки вони можуть викликати умови конкуренції та проблеми синхронізації, якщо їх не синхронізувати належним чином. Забруднення простору імен: статичні змінні можуть додати простір імен класу, потенційно спричиняючи конфлікти імен і ускладнюючи підтримку коду. Тестування: статичні змінні можуть ускладнити написання ефективних модульних тестів, оскільки стан статичної змінної може вплинути на поведінку класу та його методів.

Загалом, статичні змінні можуть бути корисним інструментом у програмуванні на Python, але їх слід використовувати з обережністю та увагою до потенційних недоліків, таких як негнучкість, приховані залежності та проблеми безпеки потоку.