в чем разница между классом и объектом в python
Различия между классом и объектом?
К своему стыду, внезапно, осознал, что не понимаю разницы между классом и объектом.
Т.е. чисто теоретически понимаю, что объект это экземпляр класса, т.е. класс это как бы заготовка, а уже объект это уже «вещь», с которой можно непосредственно работать.
Или, в данном случае, класс это просто как бы группа глобальных функций в своём «пространстве имен», которые не требуют «персонализации» путем задания уникальных значений их свойств?
Поиск в гугле почему-то не помог, в основном приводятся аналогии вида «Класс — чертежи машины, объект — сама машина», но ни слова о практическом применении.
Заранее благодарен за разъяснения, а то сия каша в голове уже начинает напрягать =)
Класс = срособ организации полей, методов и пр. = инкапсулированный «кусок» функциональности, описание структуры будущих объектов + своё пространство имён внутри.
Статическая составляющая класса — static-методы и static-поля — это логический способ организации функциональности, общей для любого объекта выделенной сущности. Тут значение имеет логическая составяющая — например, статический метод Parse есть и в классе int, и в классе Guid — но его функциональность различна и соответствует выделенной сущности. Для static-составляющей класса, в принципе, его можно воспринимать как пространство имён. Но пространсто имён нельзя инициализировать, нельзя создать объект пространства имён.
Объект = экземпляр класса = объект, типом которого является какой-то класс = класс после инициализации = сущность в памяти, обладающая поведением, способная изменять своё состояние.
Может быть вам легче будет понять, если вы будете думать о классе как о наборе функций, а об объекте как о наборе данных.
Другие функции не требуют объекта, поэтому могут быть вызваны напрямую из класса.
Я придумал свою дурацкую аналогию.
Класс — чертеж, объект класса — машина, собранная по этому чертежу.
Статический метод — это некое устройство (пусть в нашем случае будет GPS-навигатор), которое поставляется вместе с чертежом и представлено в каждой машине, построенной по этому чертежу. Устройство это никак не задействует машину, и работает само по себе.
Вы можете бегать с GPS навигатором не построив машины.
Если отойти от популярного изложения, то статические методы не связываются с экземплярами классов. И могут быть вызваны независимо от того создан экземпляр класса или нет.
Без реализации класса (создания объекта) Вы можете работать только со статическими методами/свойствами класса. Если на примере упомянутой машины — класс описывает, что это такое, а реализация (instance) класса — соответственно, реализовывает какую-то конкретную машину.
Простейший миниатюрный пример:
В итоге у нас 2 машины — VW и Жигули. Обе — экземпляры класса машина (Car). Без создания экземпляра класса Вы не зададите брэнд — нечему его задавать, собственно.
Ну это если примитивы на пальцах.
А вообще — вот, держите: про ООП на php.su
В самом простом случае: Класс — это определение общего поведения для объектов, который этот класс порождает. Объект будет иметь поведение задаваемое этим классом и отличаться от других объектов своим состоянием (ну а если состояние одинаково, то просто это будет как два одинаковых автомобиля — сущностей две разные, но выглядят одинаково ).
Далее, к классу можно добавить статические методы и поля. Здесь уже сам класс будет иметь возжность хранить свое состояние и выполнять действия. В большинстве случаев (но не во всех) это требуется для контроля над производством объектов этого класса (паттерн Синглетон, Фабрика и т.п.).
Еще далее, в объекто-ориентированных языка, все является объектом, поэтому класс тоже может являться объектом. Это нужно для того, чтобы контролировать уже сами классы, подгружать их во время работы программы или ее старта и т.п.
Все это понимание придет с опытом написания программ, просто нужно думать метафорами.
Объекты и классы Python
В этом руководстве вы узнаете об основных функциях объектов и классов Python. Вы узнаете, что такое класс, как его создать и использовать в своей программе.
Python ‒ это объектно-ориентированный язык программирования. В отличие от процедурно-ориентированного программирования, где основной упор делается на функции, объектно-ориентированное программирование делает упор на объекты.
Разница между классом и объектом в python заключается в том, что объект является экземпляром класса.
Что такое объект в Python?
Объект в Python ‒ это просто набор данных (переменных) и методов (функций), которые воздействуют на эти данные. Точно так же класс является планом для этого объекта.
Мы можем думать о классе, как об эскизе (прототипе) дома. Он содержит все подробности о этажах, дверях, окнах и т.д. На основе этих описаний мы строим дом. Дом ‒ это объект.
Поскольку многие дома можно построить из чертежей дома, мы можем создать множество объектов из класса. Объект также называется экземпляром класса, а процесс создания этого объекта называется созданием экземпляра.
Определение класса
Как и определения функций в Python начинаются с ключевого слова def, определения классов начинаются с ключевого слова class.
Первая строка внутри класса называется docstring и содержит краткое описание класса. Хотя это не обязательно, это настоятельно рекомендуется.
Вот простое определение класса:
Класс создает новое локальное пространство имен, в котором определены все его атрибуты. Атрибуты могут быть данными или функциями.
В нем также есть специальные атрибуты, которые начинаются с двойного подчеркивания __. Например, __doc__ дает нам строку документации этого класса.
Как только мы определяем класс, создается новый объект класса с тем же именем. Этот объект класса позволяет нам получать доступ к различным атрибутам, а также создавать экземпляры новых объектов этого класса.
Создание объекта
Мы увидели, что объект класса можно использовать для доступа к различным атрибутам.
Его также можно использовать для создания новых экземпляров объекта (создания экземпляров) этого класса. Процедура создания объекта аналогична вызову функции.
Атрибуты могут быть данными или методом. Методы объекта ‒ это соответствующие функции этого класса.
Это означает, что поскольку Person.greet является объектом функции (атрибутом класса), Person.greet будет объектом метода.
Вы могли заметить параметр self в определении функции внутри класса, но мы вызвали этот метод просто как harry.greet() без каких-либо аргументов. Это все еще работало.
Это потому, что всякий раз, когда объект вызывает свой метод, сам объект передается в качестве первого аргумента. Итак, harry.greet() переводится как Person.greet (harry).
В общем случае вызов метода со списком из n аргументов эквивалентен вызову соответствующей функции со списком аргументов, который создается путем вставки объекта метода перед первым аргументом.
По этим причинам первым аргументом функции в классе должен быть сам объект. Это условно называется self. Его можно назвать иначе, но мы настоятельно рекомендуем следовать правилам.
Теперь вы ознакомились с объектом класса, объектом экземпляра, объектом функции, объектом метода и их различиями.
Конструкторы в Python
Функции класса, начинающиеся с двойного подчеркивания __, называются специальными функциями, поскольку имеют особое значение.
Особый интерес представляет функция __init __(). Эта специальная функция вызывается всякий раз, когда создается новый объект этого класса.
Этот тип функций также называется конструкторами в объектно-ориентированном программировании (ООП). Обычно мы используем его для инициализации всех переменных.
В приведенном выше примере мы определили новый класс для представления комплексных чисел. В нем есть две функции: __init __() для инициализации переменных (по умолчанию ‒ ноль) и get_data() для правильного отображения числа.
Удаление атрибутов и объектов
Любой атрибут объекта можно удалить в любое время с помощью оператора del. Попробуйте выполнить следующее в оболочке Python, чтобы увидеть результат.
Мы даже можем удалить сам объект, используя оператор del.
На самом деле все намного сложнее. Когда мы делаем c1 = ComplexNumber (1,3), в памяти создается новый объект-экземпляр, и имя c1 связывается с ним.
В команде del c1 эта привязка удаляется, а имя c1 удаляется из соответствующего пространства имен. Однако объект продолжает существовать в памяти, и если к нему не привязано другое имя, он позже автоматически уничтожается.
Это автоматическое уничтожение объектов, на которые нет ссылок, в Python также называется сборкой мусора.
Основы ООП в Python — классы, объекты, методы
О ОП — самая используемая парадигма программирования. Это одновременно и особый способ мышления, и отдельная методика. Её концепцию проще всего понимать на примерах из реальной жизни. И это неспроста. Объектно-ориентированное программирование помогает представлять содержимое программы наиболее естественным для нашего мира способом.
Главным понятием ООП является понятие программного объекта. Вообще говоря, большинство сущностей на планете Земля — это некие объекты. И с частью из них мы взаимодействуем при помощи программирования. Банковский счёт, персонаж компьютерной игры или анимированный виджет сайта — всё это легко представить в виде объектов. Можно сказать, что объектно-ориентированное программирование позволяет смоделировать реальный объект в виде программного.
Множество объектов со схожими свойствами формируются в классы. Идея класса также является одной из основополагающих концепций ООП. Со стороны программы, класс — это всего лишь тип данных, но для программиста это куда более глубокая абстрактная структура. Но перейдём уже к конкретике.
💁♂️ Итак, мы — разработчики игр. Наша студия трудится над новым автосимулятором. В игре будут представлены разные виды транспорта: легковые автомобили, гоночные, грузовые и пассажирские. Все их можно описать одним словом — автотранспорт. Сделав это, мы абстрагировались от деталей и, таким образом, определили класс. Объектом этого класса может быть, как Бьюик 1968-го года, так и грузовой Freightliner Columbia желтого цвета.
У класса есть свойства и функции (в ООП их называют методами).
Свойствами класса «автотранспорт» могут быть, например: год выпуска, вид и цвет. На уровне объектов это будет выглядеть так: Бьюик Электра — это объект класса «Автотранспорт» со следующими свойствами:
Можно сказать, что объект — это вполне конкретный экземпляр класса
Помимо физических атрибутов, которые описывают внешний вид и характеристики транспортного средства, автомобили обладают между собой и другими фундаментальными сходствами. Например, все они могут ехать, тормозить, переключать скорости, поворачивать и сигналить. В нашем случае, всё это — методы класса «Автотранспорт». То есть действия, которые любые объекты данного класса могут выполнять.
Мы разрабатываем игру, поэтому предполагается, что машины в ней будут исправными. Значит, вполне естественно, что каждая из них может ехать и тормозить.
В Питоне класс «Автотранспорт» может выглядеть так:
# класс автотранспорт class MotorTransport(object): def __init__(self, color, year, auto_type): self.color = color self.year = year self.auto_type = auto_type # тормозить def stop(self): print(«Pressing the brake pedal») # ехать def drive(self): print(‘WRRRRRUM!’)
Теперь никто не помешает нам получить собственную красную феррари. Пусть и в симуляторе.
# создадим объект класса Автотранспорт ferrari_testarossa = MotorTransport(‘Red’, 1987, ‘passenger car’) # жмём на газ и вперёд! ferrari_testarossa.drive() > WRRRRRUM!
Принципы ООП
Абстракция
Абстракция — это выделение основных, наиболее значимых характеристик объекта и игнорирование второстепенных.
Любой составной объект реального мира — это абстракция. Говоря «ноутбук», вам не требуется дальнейших пояснений, вроде того, что это организованный набор пластика, металла, жидкокристаллического дисплея и микросхем. Абстракция позволяет игнорировать нерелевантные детали, поэтому для нашего сознания это один из главных способов справляться со сложностью реального мира. Если б, подходя к холодильнику, вы должны были иметь дело с отдельно металлом корпуса, пластиковыми фрагментами, лакокрасочным слоем и мотором, вы вряд ли смогли бы достать из морозилки замороженную клубнику.
Полиморфизм
Наследование
Это способность одного класса расширять понятие другого, и главный механизм повторного использования кода в ООП. Вернёмся к нашему автосимулятору. На уровне абстракции «Автотранспорт» мы не учитываем особенности каждого конкретного вида транспортного средства, а рассматриваем их «в целом». Если же более детализировано приглядеться, например, к грузовикам, то окажется, что у них есть такие свойства и возможности, которых нет ни у легковых, ни у пассажирских машин. Но, при этом, они всё ещё обладают всеми другими характеристиками, присущими автотранспорту.
Мы могли бы сделать отдельный класс «Грузовик», который является наследником «Автотранспорта». Объекты этого класса могли бы определять все прошлые атрибуты (цвет, год выпуска), но и получить новые. Для грузовиков это могли быть грузоподъёмность, снаряженная масса и наличие жилого отсека в кабине. А методом, который есть только у грузовиков, могла быть функция сцепления и отцепления прицепа.
Инкапсуляция
Инкапсуляция — это ещё один принцип, который нужен для безопасности и управления сложностью кода. Инкапсуляция блокирует доступ к деталям сложной концепции. Абстракция подразумевает возможность рассмотреть объект с общей точки зрения, а инкапсуляция не позволяет рассматривать этот объект с какой-либо другой.
Вы разработали для муниципальных служб класс «Квартира». У неё есть свойства вроде адреса, метража и высоты потолков. И методы, такие как получение информации о каждом из этих свойств и, главное, метод, реализующий постановку на учёт в Росреестре. Это готовая концепция, и вам не нужно чтобы кто-то мог добавлять методы «открыть дверь» и «получить место хранения денег». Это А) Небезопасно и Б) Избыточно, а также, в рамках выбранной реализации, не нужно. Работникам Росреестра не требуется заходить к вам домой, чтобы узнать высоту потолков — они пользуются только теми документами, которые вы сами им предоставили.
Класс
Классы, в некотором смысле, подобны чертежам: это не объекты сами по себе, а их схемы. Класс «банковских счетов» имеет строго определенные и одинаковые для всех атрибуты, но объекты в нём — сами счета — уникальны.
Как в Python создать класс
class SimpleClass: pass
Для именования классов в Python обычно используют стиль «camel case», где первая буква — заглавная.
Конструктор
Метод, который вызывается при создании объектов, в ООП зовётся конструктором. Он нужен для объектов, которые изначально должны иметь какие-то значение. Например, пустые экземпляры класса «Студент» бессмысленны, и желательно иметь хотя бы минимальный обозначенный набор вроде имени, фамилии и группы.
В качестве Питоновского конструктора выступает метод __init__() :
class Student: def __init__(self, name, surname, group): self.name = name self.surname = surname self.group = group alex = Student(«Alex», «Ivanov», «admin»)
Атрибуты класса
Поля могут быть статическими и динамическими:
☝️ Обратите внимание — статический и динамический атрибут может иметь одно и то же имя:
class MightiestWeapon: # статический атрибут name = «Default name» def __init__(self, name): # динамический атрибут self.name = name weapon = MightiestWeapon(«sword») print(MightiestWeapon.name) print(weapon.name)
Методы класса
Метод — это функция класса.
class SpaceShip: def atack(self): print(‘Пиу!’) star_destroyer = SpaceShip() star_destroyer.atack() > Пиу!
Что такое self?
🐈 Отличный пример с котофеями:
Уровни доступа атрибутов и методов
В Питоне не существует квалификаторов доступа к полям класса. Отсутствие аналогов связки public/private/protected можно рассматривать как упущение со стороны принципа инкапсуляции.
Декораторы
Декоратор — это функция-обёртка. В неё можно завернуть другой метод, и, тем самым, изменить его функциональность, не меняя код.
Объекты или экземпляры класса
Чем объекты отличаются от классов
Как уже было сказано, объект — это конкретный экземпляр класса. Все мы относимся к классу людей, но каждый из нас — уникальный объект этого класса.
Как создать объект класса в Python
Если у нас есть реализация класса, то его экземпляр создать очень просто:
class AirConditioner: def __init__(self, model, capacity): self.model = model self.capacity = capacity def turn_on(self): print(‘Now in the room will be cool’) # создадим объект класса Кондиционер ballu = AirConditioner(‘BPAC-07’, 785) ballu.turn_on() > Now in the room will be cool
Атрибуты объекта
Атрибуты класса могут быть динамическими и статическими. На уровне объекта они инициализируются так:
class MightiestWeapon: name = «Default name» def __init__(self, weapon_type): self.weapon_type = weapon_type # атрибут name можно переопределить и не создавая объекта MightiestWeapon.name = ‘Steel Sword’ print(MightiestWeapon.name) > Steal Sword # создаём объект и сразу же инициализируем динамический атрибут с помощью конструктора hero_sword = MightiestWeapon(‘sword’) # и теперь, уже для конкретного объекта, можно задать имя hero_sword.name = ‘Excalibur’ # новое статическое имя по умолчанию для всего класса не изменится print(MightiestWeapon.name) > Steal Sword print(hero_sword.name) > Excalibur
Наследование
Нередко в процессе написания кода выясняется, что некоторые объекты аналогичны другим за исключением нескольких различий. Определение сходств и различий между такими объектами называется «наследованием».
# класс «Животное». Это достаточно абстрактный класс всего с одним методом «Издать звук». class Animal: def make_a_sound(self): print(«Издаёт животный звук»)
Мы все прекрасно знаем, что котики, к примеру, любят всё ронять, а собакены — рыть землю. Создадим два соответствующих класса-наследника:
# факт наследования в Python указывается при объявлении класса-наследника. # в скобках, после имени класса, указывается класс-родитель class Cat(Animal): def drop_everything(self): print(‘Вставай скорее, я всё уронил!’) class Dog(Animal): def dig_the_ground(self): print(‘Однажды я докопаюсь до ядра планеты!’)
Теперь объекты этих двух классов могут не только издавать животные звуки, но и выполнять собственные уникальные действия:
Tom = Cat() Tom.make_a_sound() > Издаёт животный звук Tom.drop_everything() > Вставай скорее, я всё уронил!
Переопределение
Сейчас у нас и кошка, и собака просто «издают животные звуки», а хотелось бы, конечно, слышать звуки, свойственные именно этим животным. Для этого существует механика переопределения. Достаточно объявить в классе-наследнике метод с тем же названием, что и в базовом классе:
class Dog(Animal): def dig_the_ground(self): print(‘Однажды я докопаюсь до ядра планеты!’) # отныне для объектов класса «Собака» будет выполняться именно эта реализация метода def make_a_sound(self): print(‘Гав-гав!’) Balto = Dog() Balto.make_a_sound() > Гав-гав!
Документирование классов
Весь код нужно комментировать и документировать. Классы — не исключение. Стоит помнить, что код вы пишите не для себя, и вполне вероятно, что написанное вами придётся поддерживать другим людям. Комментарии повышают читаемость и увеличивают легкость восприятие кода в разы, тем самым экономя время и деньги.
ООП ещё долгое время будет оставаться передовой парадигмой программирования. Но учить её полезно и по другой причине. Прямая связь объектно-ориентированного программирования с реальным миром помогает глубже понимать устройство и принципы работы, как самого языка, так и написания кода в целом.
Класс и объект в Python
Объектно-ориентированное программирование в Python
Python — это процедурно-ориентированный и одновременно объектно-ориентированный язык программирования.
Процедурно-ориентированный
«Процедурно-ориентированный» подразумевает наличие функций. Программист может создавать функции, которые затем используются в сторонних скриптах.
Объектно-ориентированный
«Объектно-ориентированный» подразумевает наличие классов. Есть возможность создавать классы, представляющие собой прототипы для будущих объектов.
Создание класса в Python
Синтаксис для написания нового класса:
Атрибут:
Атрибут — это элемент класса. Например, у прямоугольника таких 2: ширина ( width ) и высота ( height ).
Метод:
Конструктор:
Создание объекта с помощью класса Rectangle:
Что происходит при создании объекта с помощью класса?
При создании объекта класса Rectangle запускается конструктор выбранного класса, и атрибутам нового объекта передаются значения аргументов. Как на этом изображении:
Конструктор с аргументами по умолчанию
В других языках программирования конструкторов может быть несколько. В Python — только один. Но этот язык разрешает задавать значение по умолчанию.
Все требуемые аргументы нужно указывать до аргументов со значениями по умолчанию.
Сравнение объектов
В Python объект, созданный с помощью конструктора, занимает реальное место в памяти. Это значит, что у него есть точный адрес.
Атрибуты
В Python есть два похожих понятия, которые на самом деле отличаются:
Стоит разобрать на практике:
Атрибут
Объекты, созданные одним и тем же классом, будут занимать разные места в памяти, а их атрибуты с «одинаковыми именами» — ссылаться на разные адреса. Например:
Атрибуты функции
Обычно получать доступ к атрибутам объекта можно с помощью оператора «точка» (например, player1.name ). Но Python умеет делать это и с помощью функции.
Функция | Описание |
---|---|
getattr (obj, name[,default]) | Возвращает значение атрибута или значение по умолчанию, если первое не было указано |
hasattr (obj, name) | Проверяет атрибут объекта — был ли он передан аргументом «name» |
setattr (obj, name, value) | Задает значение атрибута. Если атрибута не существует, создает его |
delattr (obj, name) | Удаляет атрибут |
Встроенные атрибуты класса
Объекты класса — дочерние элементы по отношению к атрибутам самого языка Python. Таким образом они заимствуют некоторые атрибуты:
Переменные класса
Переменные класса в Python — это то же самое, что Field в других языках, таких как Java или С#. Получить к ним доступ можно только с помощью имени класса или объекта.
Для получения доступа к переменной класса лучше все-таки использовать имя класса, а не объект. Это поможет не путать «переменную класса» и атрибуты.
У каждой переменной класса есть свой адрес в памяти. И он доступен всем объектам класса.