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