В главе 08 мельком упоминалось, что C++ принёс в индустрию смену парадигмы — объекты вместо чистых процедур. Здесь наконец видно, что это значит на практике, и почему это не просто другой синтаксис для того же самого.
Весь код этой книги до сих пор был написан в процедурном стиле: данные (переменные, списки, словари) и функции, которые их обрабатывают, существуют отдельно друг от друга — функция принимает данные как аргумент и что-то с ними делает. Объектно-ориентированный подход предлагает другую модель: объединить данные и работающие с ними функции (называемые в этом контексте методами) в единую сущность — объект.
class Dog: описывает шаблон — какие данные (атрибуты) и
какое поведение (методы) есть у любой собаки в терминах этой программы. my_dog
— конкретный объект (экземпляр), созданный по этому шаблону, с
собственными конкретными значениями атрибутов.
__init__ — специальный метод, автоматически вызываемый в момент создания
нового объекта — конструктор, задающий начальное состояние объекта. self —
первый параметр каждого метода класса, ссылающийся на тот конкретный объект, с которым
сейчас работает код — именно через self.name метод получает доступ к данным
именно этого экземпляра, а не какого-то другого объекта того же класса.
Если создать двух разных собак (Dog("Рекс", 3) и Dog("Бобик", 5)),
у каждой будет собственное значение self.name и self.age —
несмотря на то, что метод bark() определён в классе всего один раз, вызов
my_dog.bark() и other_dog.bark() обратится к данным именно
того объекта, у которого метод был вызван — self и есть тот самый механизм,
который это обеспечивает.
Разница с функциональной версией из главы 23: self.log_path и
self.counts "живут" вместе с объектом между вызовами методов — не нужно
передавать их как аргументы в каждую функцию заново, объект сам "помнит" своё состояние.
Это особенно удобно, когда данных и связанных с ними операций становится много.
Класс Dog(Animal) автоматически получает всё, что определено в
Animal, и может добавлять собственные методы или переопределять
унаследованные. Это позволяет выстраивать иерархии связанных классов, не копируя общий код
в каждый из них заново — прямое продолжение принципа DRY, уже прозвучавшего в главе 16.
Большая часть популярных библиотек Python (включая многое из следующих глав — работа с последовательным портом в главе 26) устроена именно в объектном стиле: подключение к устройству возвращает объект, у которого есть методы для чтения, записи, закрытия соединения — состояние (открыто ли соединение, какой порт) естественно живёт вместе с этим объектом, а не передаётся отдельным набором переменных в каждую функцию.
Следующая глава — тема, без которой ни один код, включая написанный в этой главе, не может считаться профессионально завершённым: Git, система версионирования, отслеживающая историю изменений кода.
Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.