Python - Атрибуты класса
Привет, молодые программисты! Сегодня мы погрузимся в захватывающий мир атрибутов классов в Python. Не волнуйтесь, если вы новичок в программировании; я веду вас шаг за шагом, как я делал это для многих студентов на протяжении многих лет своей преподавательской деятельности. Так что начнем!

Атрибуты класса (Переменные)
Атрибуты класса — это переменные, принадлежащие всему классу, а не конкретному экземпляру класса. Представьте их как характеристики, общие для всех объектов данного класса.
Начнем с простого примера:
class Dog:
species = "Canis familiaris"
def __init__(self, name, age):
self.name = name
self.age = age
fluffy = Dog("Fluffy", 3)
buddy = Dog("Buddy", 5)
print(Dog.species) # Вывод: Canis familiaris
print(fluffy.species) # Вывод: Canis familiaris
print(buddy.species) # Вывод: Canis familiaris
В этом примере species — это атрибут класса. Он определен прямо внутри класса, но вне любых методов. Все объекты Dog делятся этим атрибутом.
Доступ к атрибутам класса
Как вы можете видеть из примера выше, вы можете получить доступ к атрибутам класса двумя способами:
- Через сам класс:
Dog.species - Через любой экземпляр класса:
fluffy.speciesилиbuddy.species
Оба способа дадут вам один и тот же результат. Это как спрашивать: "Какой вид есть у собак?" или "Какой вид есть у Fluffy?" — ответ одинаков!
Изменение атрибутов класса
Атрибуты класса можно изменять, но будьте осторожны! Когда вы изменяете атрибут класса, он изменяется для всех экземпляров класса. Давайте посмотрим на пример:
class Cat:
species = "Felis catus"
count = 0
def __init__(self, name):
self.name = name
Cat.count += 1
whiskers = Cat("Whiskers")
mittens = Cat("Mittens")
print(Cat.count) # Вывод: 2
print(whiskers.count) # Вывод: 2
print(mittens.count) # Вывод: 2
Cat.species = "Felis silvestris catus"
print(Cat.species) # Вывод: Felis silvestris catus
print(whiskers.species) # Вывод: Felis silvestris catus
print(mittens.species) # Вывод: Felis silvestris catus
В этом примере мы используем атрибут класса count, чтобы отслеживать, сколько кошек мы создали. Каждый раз, когда мы создаем новый объект Cat, мы увеличиваем Cat.count. Также мы изменили species для всех кошек одновременно, изменив Cat.species.
Значение атрибутов класса
Атрибуты класса чрезвычайно полезны в нескольких сценариях:
- Хранение констант, которые должны быть одинаковыми для всех экземпляров класса.
- Отслеживание данных по всем экземплярам класса (как в нашем примере
Cat.count). - Определение значений по умолчанию, которые могут быть переопределены в экземплярах, если это необходимо.
Встроенные атрибуты класса
Классы Python имеют некоторые встроенные атрибуты, которые могут быть очень полезны. Давайте рассмотрим несколько из них:
class MyClass:
x = 5
def my_method(self):
pass
print(MyClass.__name__) # Вывод: MyClass
print(MyClass.__doc__) # Вывод: None (потому что мы не предоставили docstring)
print(MyClass.__dict__) # Вывод: {'__module__': '__main__', 'x': 5, 'my_method': <function MyClass.my_method at ...>}
print(MyClass.__module__) # Вывод: __main__
Доступ к встроенным атрибутам класса
Вот таблица некоторых распространенных встроенных атрибутов класса и как к ним получить доступ:
| Атрибут | Описание | Доступ |
|---|---|---|
| name | Имя класса | MyClass.name |
| doc | Docstring класса | MyClass.doc |
| dict | Словарь, содержащий пространство имен класса | MyClass.dict |
| module | Имя модуля, в котором определен класс | MyClass.module |
| bases | Кортеж, содержащий базовые классы | MyClass.bases |
Атрибуты экземпляра
Теперь, когда мы понимаем атрибуты класса, давайте кратко рассмотрим атрибуты экземпляра, чтобы увидеть разницу. Атрибуты экземпляра уникальны для каждого созданного из класса объекта.
class Student:
school = "Python High" # Атрибут класса
def __init__(self, name, grade):
self.name = name # Атрибут экземпляра
self.grade = grade # Атрибут экземпляра
alice = Student("Alice", 10)
bob = Student("Bob", 11)
print(Student.school) # Вывод: Python High
print(alice.school) # Вывод: Python High
print(bob.school) # Вывод: Python High
print(alice.name) # Вывод: Alice
print(bob.name) # Вывод: Bob
Student.school = "Python University"
print(alice.school) # Вывод: Python University
print(bob.school) # Вывод: Python University
alice.school = "Python Elementary"
print(alice.school) # Вывод: Python Elementary
print(Student.school) # Вывод: Python University
print(bob.school) # Вывод: Python University
Атрибуты экземпляра vs Атрибуты класса
Основные различия между атрибутами экземпляра и класса:
- Атрибуты класса общие для всех экземпляров, в то время как атрибуты экземпляра уникальны для каждого экземпляра.
- Атрибуты класса определяются в классе, но вне любых методов, в то время как атрибуты экземпляра обычно определяются внутри метода
__init__. - Изменение атрибута класса влияет на все экземпляры (если экземпляр не переопределил его), в то время как изменение атрибута экземпляра влияет только на этот конкретный экземпляр.
Помните, когда вы пытаетесь получить доступ к атрибуту на экземпляре, Python сначала ищет атрибут экземпляра. Если он его не находит, он затем ищет атрибут класса. Поэтому мы можем "переопределить" атрибут класса для конкретного экземпляра, создав атрибут экземпляра с тем же именем.
И это все! Вы только что завершили краткий курс по атрибутам классов в Python. Помните, ключ к владению программированием — это практика. Так что не стесняйтесь экспериментировать с этими концепциями. Создавайте свои собственные классы, играйтесь с атрибутами и посмотрите, что произойдет. Счастливого кодирования!
Credits: Image by storyset
