Форум сайта python.su
Сначало я думал, что классы необходимы для создания своего пространство имён (что-то между функцией и модулём, так сказать микропрограмма), потом я думал, что классы используется в основном лишь только в играх и в создании языков, так как всё остальное можно реализовать с помощью функций, после я думал, что они нужны для создания собственных типов данных (не знаю даже как это объяснить).А зачем тебе что-то объяснять? Ты и сам обо всём догадался. Реальные программы оперируют сущностями реального мира, которые ограничены рамками предметной области. Очевидно то что-бы ими оперировать нужен тип данных который эти сущности описывает. Этим типом данных и является класс, а экземпляр класса это сами данные. С технической точки зрения объект это пространство имён (т.е. словарь) в котором содержаться свойства (т.е. информация об объекте) и методы (т.е. функции при помощи которых можно с этим объектом взаимодействовать). Ну вот собственно в этом основная идея ООП и заключается.
Отредактировано Rodegast (Сен. 16, 2017 00:52:21)
Офлайн
georgiy_ya
Вот я счаз смотрел автогонки и быстренько тебе придумал задание.
Реализуй программу которая бы симулировала проведение гонок. Для простоты путь это будут гонки по прямой на S км. Автомобили должны уметь разгоняться, ехать на максимальной скорости, тормозить. Всего должны участвовать N машин каждая из которых должна 1 раз состязаться со всеми другими. В каждом заезде участвует одновременно 2 автомобиля. Победителю заезда начисляется P очков.
Каждый автомобиль имеет свои характеристики - номер, ускорение (м/c2), максимальная скорость (км/ч), торможение (- м/c2).
Основная задача - выявить победителя, ну и в дополнение определить у кого был самый короткий тормозной путь.
Вот вам тут и классы, и экземпляры и их взаимодействие. Ну и еще чуток физики что бы мозг размять.
По моему для начала сойдет. Давайте мы с вами договоримся что вы решаете эту задачу, а после я вам кое что еще дам и вы сразу прочувствуете как классы полезны.
Офлайн
georgiy_yaООП используют для борьбы со сложностью. Это основа всех техник программирования - побороть сложность, сложную систему представить в простом виде.
В том то собственно и дело, что я не совсем понимаю для чего необходимо пользоваться ООП.
georgiy_yaВ питоне почти всё является объектом (операции не являются). Ты не можешь передать операцию куда-то, чтобы она там была применена или сохранена. Это в лиспе можно так делать - превращать код в данные и данные в код. Да, в питоне ты работаешь с объектами, но ты их не создаёшь, они уже встроены в питон (в само ядро языка или в модули его).
Я понимаю, что всё в Python'е объекты, то есть экземпляры классов, так? Значит когда мы что то создаём мы создаём всего лишь экземпляр какого то класса, так?
>>> 2 * 3 6 >>> 2 * 'a' 'aa' >>> 2 * [1] [1, 1] >>>
Отредактировано py.user.next (Сен. 16, 2017 16:04:22)
Офлайн
Rodegast
Это всё я конечно же понимаю. Вы очень подробно всё описали, новичку это очень поможет.
Офлайн
JOHN_16
Так как временем я дорожу, формулы по физике я почти не помню, а смысла в написании этой задачи почти нету, то я подготовил лишь каркас.
class Car: LIST_OF_TORMOZ = {} def __init__(self, max_speed, nomer, size, model, tormoz, uskor): self.point = 0 # Хар-ки self.max_speed = max_speed self.nomer = nomer self.size = size self.model = model self.tormoz = tormoz self.uskorenie = uskor self.current_speed = self.max_speed/2 def tormoz_put(self): self.TORMOZ_PUT = (self.max_speed^2)/(2*self.uskorenie) Car.LIST_OF_TORMOZ.update({str(self.model): int(self.TORMOZ_PUT)}) print(Car.LIST_OF_TORMOZ) def tormozi(self): self.current_speed -= self.tormoz def razgon(self, kmOh): self.current_speed += self.uskorenie def __add__(self, other): if self.current_speed>other.current_speed: self.point += 1 del other return 'The %s with %d' %(self.model, self.nomer) elif self.current_speed < other.current_speed: other.point +=1 del self return 'The %s with %d'%(other.model, other.nomer) else: return 'NOBODY' obj11 = Car(154, 8238, 12, 'Mersedez', 12, uskor=3.2) obj11.tormoz_put() obj11.tormozi() obj2 = Car(154, 1351, 14, 'Ferrari', 3213, uskor=3.2) obj2.tormoz_put() obj2.tormozi() print() print('Current speed of {0} is '.format(obj11.model), obj11.current_speed) print('Current speed of {0} is '.format(obj2.model), obj2.current_speed, end='\n\n') g = obj11+obj2 print(g, end='\n') print(obj11.point) print(obj2.point)
Офлайн
py.user.next
Мне кажется что ООП очень сильно усложнили в плане понимания. Зачем термин “Перегрузка операторов” назвали именно так? Почему не “Переопределение операторов”? По сути, это именно “переопределение оператора”, а не его перегрузка. Вообще слово “перегрузка” вызывает у меня асоциацию с перегрузом какого либо товара, а не с тем, что “на оператор падает что-то сверху”. Ещё например: зачем 2 одинаковых слова: экземпляр класса и объект? Или же всё таки какое-то отличия между ними есть? Сколько тайн ещё хранит в себе это долбанное ООП? Саму концепцию ООП слишком уж усложнили и навеяли много шума вокруг неё, из-за этого страдают простые новчики.
Отредактировано georgiy_ya (Сен. 16, 2017 22:16:15)
Офлайн
georgiy_ya
перегрузка и переопределение в ООП означают совершенно разные вещи. Питон - далеко не единтсвенный ООП язык, он использует общую терминологию, но реализует далеко не все фишки других языков. Поэтому “перегрузка” и “переопределение ” в питоне одно и то же, а в Джаве - нет.
Офлайн
FishHook
А насчёт объектов и экземпляров?
Офлайн
> я подготовил лишь каркас.
У тебя только класс для автомобиля, а ведь ещё и трасса есть. Трасса имеет ровные участки и повороты, на поворотах надо тормозить, а на ровных учатках разгоняться.
> А насчёт объектов и экземпляров?
Сам класс является объектом, но не является экземпляром класса.
Офлайн
georgiy_yaПерегрузка называется так потому, что на одно имя вешается несколько разных функций и они все работают. То есть имя одно, а функции разные на нём. В питоне нет перегрузки функций, её можно делать только обходными путями. В питоне только переопределение есть - это замена одной функции на другую под одним именем. Тебе даже в книгах по питону могут писать, что это перегрузка, но это не перегрузка, а переопределение. А перегрузка в классическом виде есть и в Java, и в С++, и в других языках.
Зачем термин “Перегрузка операторов” назвали именно так? Почему не “Переопределение операторов”? По сути, это именно “переопределение оператора”, а не его перегрузка.
georgiy_yaНазвание “экземпляр класса” подчёркивает, что есть класс. А когда мы говорим “объект”, то нас его класс не интересует. Это синонимы (типа как “радоваться” и “смеяться”), которые придают определённый оттенок сказанному.
Ещё например: зачем 2 одинаковых слова: экземпляр класса и объект?
Отредактировано py.user.next (Сен. 17, 2017 13:00:35)
Офлайн