Переменные экземпляра и класса
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 13 из 64.
Переменные экземпляра уникальны для каждого объекта, в то время как переменные класса являются общими для всех объектов одного и того же класса.
Вот пример класса с обоими типами переменных
class Student:
# Переменная класса — общая для всех экземпляров
school = "Python High School"
def __init__(self, name, grade):
# Переменные экземпляра — уникальные для каждого студента
self.name = name
self.grade = gradeСоздайте объекты студентов:
alice = Student("Alice", "A")
bob = Student("Bob", "B")Доступ к переменным экземпляра (уникальным для каждого объекта):
print(alice.name) # Alice
print(bob.name) # Bob
print(alice.grade) # A
print(bob.grade) # BДоступ к переменным класса (общим для всех объектов):
print(alice.school) # Python High School
print(bob.school) # Python High School
print(Student.school) # Python High SchoolТеперь измените переменную класса:
Student.school = "Python Academy"Посмотрите, как изменение влияет на все экземпляры:
print(alice.school) # Python Academy
print(bob.school) # Python AcademyВывод:
Alice
Bob
A
B
Python High School
Python High School
Python High School
Python Academy
Python AcademyВы также можете создавать переменные экземпляра после создания объекта:
alice.age = 16 # Это создает переменную экземпляра
print(alice.age) # 16
# print(bob.age) # Это вызовет ошибку — у bob нет ageКлючевое отличие: Переменные экземпляра (созданные с помощью self.variable_name) уникальны для каждого объекта, в то время как переменные класса (определенные непосредственно в классе) являются общими для всех объектов. Изменение переменной класса влияет на все экземпляры.
Задание
ЛегкоЗавершите банковскую систему. Вы определите класс BankAccount в одном файле и будете использовать его в другом.
Вы будете работать с:
bank_account.py: Определите классBankAccountс атрибутами и методамиdriver.py: Импортируйте класс, создайте аккаунты и продемонстрируйте переменные класса
Следуйте комментариям TODO в обоих файлах для получения пошаговых инструкций. Комментарии помогут вам создать класс с соответствующими переменными, методами и покажут, как переменные класса влияют на все экземпляры.
Шпаргалка
Переменные экземпляра уникальны для каждого объекта, в то время как переменные класса являются общими для всех объектов одного и того же класса.
Класс с обоими типами переменных:
class Student:
# Class variable - shared by all instances
school = "Python High School"
def __init__(self, name, grade):
# Instance variables - unique to each student
self.name = name
self.grade = gradeДоступ к переменным экземпляра (уникальным для каждого объекта):
alice = Student("Alice", "A")
bob = Student("Bob", "B")
print(alice.name) # Alice
print(bob.name) # BobДоступ к переменным класса (общим для всех объектов):
print(alice.school) # Python High School
print(bob.school) # Python High School
print(Student.school) # Python High SchoolИзменение переменных класса влияет на все экземпляры:
Student.school = "Python Academy"
print(alice.school) # Python Academy
print(bob.school) # Python AcademyСоздание переменных экземпляра после создания объекта:
alice.age = 16 # This creates an instance variable
print(alice.age) # 16Попробуйте сами
# TODO: Импортируйте класс BankAccount из bank_account.py
from bank_account import BankAccount
# TODO: Создайте два аккаунта со следующими данными:
# - account1: владелец "Alice Smith" с балансом $1000
# - account2: владелец "Bob Jones" с балансом $2000
# TODO: Вызовите display_info() для обоих аккаунтов
# TODO: Измените переменную класса interest_rate на 0.03 (3%)
# Используйте этот формат: BankAccount.interest_rate = 0.03
# TODO: Выведите текст "After interest rate change:"
# TODO: Снова вызовите display_info() для обоих аккаунтов, чтобы показать, что у них обоих новая процентная ставкаВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User