Перейти к содержимому

Какая разница между объектом и классом

  • автор:

Какая разница между экземпляром и объектом?

Например, в книге Липпмана по С++ есть похожий говноперевод выражения «class type» как «тип класса».

anatoly ★
( 29.11.15 15:33:04 MSK )

Объект, конкретно в питоне, это сущность удовлетворяющая определённому интерфейсу. В частности, у объекта есть список методов (поле __dict__) и ссылка на его тип (поле __class__). Практически все сущности, с которыми можешь работать в питоне, есть объекты. Классы, т.е. на что указывает поле __class__, тоже являются объектами.

Экземпляр (instance) понятие логическое, в питоне под ним подразумевается объект определённого типа. Т.е. объект у которого __class__ указывает на тип X называется экземпляром типа X.

Ну а «объект экземпляра» похоже на тавтологнию, нужно смотреть контекст чтобы понять вкладываемый смысл в это выражение.

mashina ★★★★★
( 29.11.15 15:48:37 MSK )
Последнее исправление: mashina 29.11.15 15:54:05 MSK (всего исправлений: 4)

Такая же, как между теплым и мягким. Одно — теплое, другое — мягкое.

В чем разница между классом, объектом и экземпляром?

Никак не могу понять, в чём разница между объектом и классом. У меня есть предположение, что класс — это что-то общее, то есть, обширное понятие, а объект — что-то более узкое. Что касается экземпляра и объекта, так я думаю, что это одно и то же. Буду очень благодарен, если вы поможете мне разобраться.

Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 11 авг 2018 в 19:55
81 1 1 золотой знак 1 1 серебряный знак 2 2 бронзовых знака
В каком языке используется?
12 авг 2018 в 8:20
@RomanC а что в разных языках программирования понятия класса объекта или же экземпляра разные?
12 авг 2018 в 17:39
Возможный дубликат вопроса: Какая разница между экземпляром и объектом класса?
– user206435
12 авг 2018 в 19:21
@SeeSharp концептуально везде примерно одно и тоже.
13 авг 2018 в 8:55
@Suvitruf я тоже так думаю, тогда к чему первый комментарий?
13 авг 2018 в 9:08

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Класс — некая абстракция, логическая структура, описывающая поведение и характеристики. Например, машина. Она может ехать, сигналить и т.п.

Объект — конкретный экземпляр класса. Например, конкретная ваша машина.

Экземпляр класса — это одно и тоже, что и объект класса.

| № | Объект | Класс | |:-------------------------------|-----------------------------------------------------:| | 1 | Объект - экземпляр класса | Класс - шаблон, по которому создаются объекты | | 2 | Сущность из реального мира | Группа похожих объектов | | 3 | Физическая сущность | Логическая сущность | | 4 | Объект СОЗДАЁТСЯ | Класс ОПИСЫВАЕТСЯ | | 5 | Объект можно создавать, | Класс определяется единожды | | как правило, много раз | | 

Класс: фрукт, Объект: киви, банан, манго.

Отслеживать
ответ дан 11 авг 2018 в 19:57
Suvitruf — Andrei Apanasik Suvitruf — Andrei Apanasik
32.2k 15 15 золотых знаков 61 61 серебряный знак 93 93 бронзовых знака
Разве правильно говорить не характеристики, а состояние?
20 авг 2019 в 10:48
@MikeMclaren у класса нет состояния, состояние только у объектов.
20 авг 2019 в 11:10
А чем тогда отличаются характеристики от состояния?
21 авг 2019 в 8:33

Как правильно подметил пользователь Suvitruf понятия класс и объект очень тесно связаны между собой.

Что такое класс и его экземпляры?

Давайте приведем пример на ситуации из подобного C ЯП C# а далее будет рассмотрен пример из реальной жизни.

class Human

Здесь мы объявили класс . Что же мы сделали объявив класс?? Мы создали шаблон сущности который в дальнейшем мы можем использовать для создания новый экземпляров класса . Вот тут мы зададимся вопросом (которым Вы собственно и задались). А что такое экземпляр класса ?? Это некий конкретный объект который может уже применяться изменяться как Вашей душе угодно. В примере выше, я объявил класс Human . Давайте же сейчас создадим его экземпляр:

Human concret_human = new Human(); 

Теперь после создания экземпляра класса, мы можем проводить какие либо манипуляции которые возможно применить к данному классу. Какие? Это уже от класса зависит. Проще говоря, класс это некий шаблон, который может использоваться для создания новый объектов или как у бородатых умных дядей экземпляров какого либо класса.

Пример из реальной жизни

Теперь давайте попробуем привести пример из реальной жизни. Вы крупный инженер сотовых телефонов. Что бы сделать новую конкретную модель телефона, Вам нужно иметь шаблон в роли которого в программировании выступает класс. В шаблоне указано что каждый телефон должен звонить, включаться, выключаться и принимать звонки например. И по шаблону мы уже делаем конкретный объект который уже что-то может изменять в себе или использовать по назначению.

Итоги

Давайте подведем итоги.

  1. Класс — это некий шаблон, который предоставляет абстрактный вид любого объекта.
  2. Объект или Экземпляр класса — это уже конкретная сущность которая сделана по шаблону класса.

Какая разница между объектом и классом

Подобный вопрос может служить проверкой Ваших знаний терминологии объектно-ориентированного программирования (object oriented programming, сокращенно OOP). Такой же вопрос можно было бы задать в контексте интервью программиста C++, или любой позиции вакансии, которая требует понимания концепции объектов в программировании.

Термины class и object определенно связаны друг с другом, но каждый из них имеет свой отдельный смысл. Начнем с объяснения смысла термина «class» в контексте OOP. Определение class относится к реально написанной части кода, которая используется для определения поведения любого такого класса. Итак, class это статическая часть кода, состоящая из атрибутов, которые не меняются во время выполнения программы — наподобие определений методов класса.

Объект это экземпляр класса. Однако термин object относится к реально существующему экземпляру класса. Каждый объект должен принадлежать классу. Объекты создаются и уничтожаются в программе по мере необходимости, поэтому их время жизни ограничено. Пока объекты «живые», их свойства могут значительно меняться.

Конкретный пример поможет разобраться в том, о чем тут идет речь. Предположим, что у нас есть класс Animal (животное). Все животные имеют тела и мозги — и поэтому они могли бы быть атрибутами нашего вымышленного класса Animal. Также мы можем добавить к классу некоторые методы, которые общие у всех животных — такие как movement (перемещение), потому что все животные могут двигаться. Идея, которую Вы хотите осуществить в своем представлении, состоит в том, что этот очень общий шаблон Animal не изменяется, он просто дает несколько строк кода, которые определяют класс Animal.

Экземпляр класса Animal был бы определенным животным — львом, кошкой или зеброй. Эти экземпляры класса называются объектами. Принимая во внимание, что класс Animal — общее понятие, экземпляры этого класса — львы, коты и т. д. — берут за основу общее понятие класса и создают его реальные экземпляры.

Именно по этой причине программисты определяют конструкторы в своих классах — так происходит всегда, когда они хотят создавать объект с определенными свойствами. Например, какого вида животное должно быть, как его зовут, сколько оно весит и т. д. Так что Вы можете думать о конструкторе объекта как о чем-то таком, которое вводит класс в жизнь программы — отсюда и пошло название constructor, потому что функция конструктора создает определенный экземпляр класса.

У объектов есть понятие «время жизни», а у класса нет. И как ясно показывает наш пример класса Animal, каждый объект в программе имеет связанный с ним интервал времени жизни — кот или зебра не могут жить вечно. И свойства этих объектов могут меняться в течении их «жизни»; если мы определим переменную size в классе Animal, то она может обозначать размер животного (например, размер кота как объекта со временем может расти).

Общее отличие объекта от класса. Можно сказать, что в то время как класс является общей концепцией предметного понятия (наподобие Animal), объект это очень определенное воплощение этого класса, причем с ограниченным временем жизни в программе. Другой способ думать об отличии между классом и объектом — класс предоставляет шаблон для чего-то более специального, которое должен определить программист при создании объекта этого класса.

[Ссылки]

1. In Java, what’s the difference between an object and a class? site:programmerinterview.com.

Различия между классом и объектом?

К своему стыду, внезапно, осознал, что не понимаю разницы между классом и объектом.

Т.е. чисто теоретически понимаю, что объект это экземпляр класса, т.е. класс это как бы заготовка, а уже объект это уже «вещь», с которой можно непосредственно работать.

Но тогда почему (если рассматривать вопрос в PHP), я все-таки могу работать с методами класса ( ClassName::MethodName() ), так же как и с методами объекта ( $c = new ClassName; $c->MethodName() ), хотя, в первом случае никакого объекта не создано.

Или, в данном случае, класс это просто как бы группа глобальных функций в своём «пространстве имен», которые не требуют «персонализации» путем задания уникальных значений их свойств?

Поиск в гугле почему-то не помог, в основном приводятся аналогии вида «Класс — чертежи машины, объект — сама машина», но ни слова о практическом применении.

Заранее благодарен за разъяснения, а то сия каша в голове уже начинает напрягать =)

  • Вопрос задан более трёх лет назад
  • 60009 просмотров

Комментировать
Решения вопроса 1

Класс = срособ организации полей, методов и пр. = инкапсулированный «кусок» функциональности, описание структуры будущих объектов + своё пространство имён внутри.

Статическая составляющая класса — static-методы и static-поля — это логический способ организации функциональности, общей для любого объекта выделенной сущности. Тут значение имеет логическая составяющая — например, статический метод Parse есть и в классе int, и в классе Guid — но его функциональность различна и соответствует выделенной сущности. Для static-составляющей класса, в принципе, его можно воспринимать как пространство имён. Но пространсто имён нельзя инициализировать, нельзя создать объект пространства имён.

Объект = экземпляр класса = объект, типом которого является какой-то класс = класс после инициализации = сущность в памяти, обладающая поведением, способная изменять своё состояние.

Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Ответы на вопрос 6

Может быть вам легче будет понять, если вы будете думать о классе как о наборе функций, а об объекте как о наборе данных.

Некоторые функции в классе могут быть использованы только с набором данных (т.е. объектом), который передается неявно, когда вы указываете $object->method() .

Другие функции не требуют объекта, поэтому могут быть вызваны напрямую из класса.

С этой точки зрения очень логично выглядит Python, где у любого метода есть явный аргумент self, указывающий на объект, из которого был вызван метод. А запись object.method(5) является краткой записью ObjectClass.method(object, 5) .

Ответ написан более трёх лет назад
Нравится 21 1 комментарий
xinn @xinn Автор вопроса
Отлично! Очень Вам благодарен за ответ, похоже это как раз то, чего мне не хватало.

Я придумал свою дурацкую аналогию.

Класс — это бог, который есть всегда. И бог по образу и подобию своему создаёт экземпляры — человеков. Каждый человек наделён своим набором свойств (рост, вес, . ) и методов (плавать, ходить, летать, . ). А бог в свою очередь наделён общими для всех методами: принимать мольбы, карать, посылать манну небесную и сотворить чудо. Эти методы могут быть приватными. Т.е. бог например может принимать мольбы только людей, а не марсиан. А вот сотворить чудо может как для людей, так и для марсиан — ему не жалко.

Ответ написан более трёх лет назад
Комментировать
Нравится 17 Комментировать

Rafael

Класс — чертеж, объект класса — машина, собранная по этому чертежу.

Статический метод — это некое устройство (пусть в нашем случае будет GPS-навигатор), которое поставляется вместе с чертежом и представлено в каждой машине, построенной по этому чертежу. Устройство это никак не задействует машину, и работает само по себе.

Вы можете бегать с GPS навигатором не построив машины.

Если отойти от популярного изложения, то статические методы не связываются с экземплярами классов. И могут быть вызваны независимо от того создан экземпляр класса или нет.

Ответ написан более трёх лет назад
Нравится 3 2 комментария
xinn @xinn Автор вопроса

Т.е. я немного прав проводя аналогию с «группой глобальных функций» касаемо статических методов/свойств и классов?

Rafael

Набор статических методов и свойств может быть рассмотрен как набор глобальных функций и глобальных переменных, которые не требуют создания экземпляра класса, так как в нём не нуждаются.

Chvanikoff @Chvanikoff

Без реализации класса (создания объекта) Вы можете работать только со статическими методами/свойствами класса. Если на примере упомянутой машины — класс описывает, что это такое, а реализация (instance) класса — соответственно, реализовывает какую-то конкретную машину.

Простейший миниатюрный пример:

class Car < public $brand = NULL; >$car = new Car; $car->brand = 'VW'; $car2 = new Car; $car2->brand = 'Жигули'; 

В итоге у нас 2 машины — VW и Жигули. Обе — экземпляры класса машина (Car). Без создания экземпляра класса Вы не зададите брэнд — нечему его задавать, собственно.

Ну это если примитивы на пальцах.
А вообще — вот, держите: про ООП на php.su

Ответ написан более трёх лет назад
Нравится 2 1 комментарий
xinn @xinn Автор вопроса

Видно я не совсем корректно составил вопрос: то, что Вы написали и есть то, что гуглится с легкостью, и приведенную Вами ссылку я, конечно же, посещал ранее и чего надеялся избежать в ответах.
Спасибо за разъяснение насчет статических методов.

В самом простом случае: Класс — это определение общего поведения для объектов, который этот класс порождает. Объект будет иметь поведение задаваемое этим классом и отличаться от других объектов своим состоянием (ну а если состояние одинаково, то просто это будет как два одинаковых автомобиля — сущностей две разные, но выглядят одинаково ).

Далее, к классу можно добавить статические методы и поля. Здесь уже сам класс будет иметь возжность хранить свое состояние и выполнять действия. В большинстве случаев (но не во всех) это требуется для контроля над производством объектов этого класса (паттерн Синглетон, Фабрика и т.п.).

Еще далее, в объекто-ориентированных языка, все является объектом, поэтому класс тоже может являться объектом. Это нужно для того, чтобы контролировать уже сами классы, подгружать их во время работы программы или ее старта и т.п.

Все это понимание придет с опытом написания программ, просто нужно думать метафорами.

Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Алексей Сидоров @Gorthauer87
Программист

Всё просто. В случае класса это просто некое описание методов, полей и т.д. Когда мы вызываем любой метод класса, то в аргументах мы неявно передаем указатель this.
То есть в реальности вызов
a->b(arg);
выглядит как
b(arg,a);
А static методы они отличаются от обычных тем, что у них нету этого неявного аргумента this

Ответ написан более трёх лет назад

В php у static методов есть неявные «аргументы» (вообще ключевые слова, равно как и this) self и parent. В python аналогичные аргументы вообще явные, чисто по соглашениям их называют self для методов объектов и class для методов класса, а вообще возможно называть как угодно.

Ваш ответ на вопрос

Войдите, чтобы написать ответ

php

  • PHP
  • +1 ещё

Как сделать авторизацию через VK в Wowonder?

  • 1 подписчик
  • 3 часа назад
  • 31 просмотр

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *