Найти - Пользователи
Полная версия: Оцените ОО код.
Начало » Python проекты » Оцените ОО код.
1 2 3 4 5 6
Rodegast
Сначало я думал, что классы необходимы для создания своего пространство имён (что-то между функцией и модулём, так сказать микропрограмма), потом я думал, что классы используется в основном лишь только в играх и в создании языков, так как всё остальное можно реализовать с помощью функций, после я думал, что они нужны для создания собственных типов данных (не знаю даже как это объяснить).
А зачем тебе что-то объяснять? Ты и сам обо всём догадался. Реальные программы оперируют сущностями реального мира, которые ограничены рамками предметной области. Очевидно то что-бы ими оперировать нужен тип данных который эти сущности описывает. Этим типом данных и является класс, а экземпляр класса это сами данные. С технической точки зрения объект это пространство имён (т.е. словарь) в котором содержаться свойства (т.е. информация об объекте) и методы (т.е. функции при помощи которых можно с этим объектом взаимодействовать). Ну вот собственно в этом основная идея ООП и заключается.
P.S. Кроме ООП существуют другие методологии описания предметной области (например Алгебраические Тип Данных), но это уже не про Python.
JOHN_16
georgiy_ya
Вот я счаз смотрел автогонки и быстренько тебе придумал задание.
Реализуй программу которая бы симулировала проведение гонок. Для простоты путь это будут гонки по прямой на S км. Автомобили должны уметь разгоняться, ехать на максимальной скорости, тормозить. Всего должны участвовать N машин каждая из которых должна 1 раз состязаться со всеми другими. В каждом заезде участвует одновременно 2 автомобиля. Победителю заезда начисляется P очков.
Каждый автомобиль имеет свои характеристики - номер, ускорение (м/c2), максимальная скорость (км/ч), торможение (- м/c2).
Основная задача - выявить победителя, ну и в дополнение определить у кого был самый короткий тормозной путь.
Вот вам тут и классы, и экземпляры и их взаимодействие. Ну и еще чуток физики что бы мозг размять.
По моему для начала сойдет. Давайте мы с вами договоримся что вы решаете эту задачу, а после я вам кое что еще дам и вы сразу прочувствуете как классы полезны.
py.user.next
georgiy_ya
В том то собственно и дело, что я не совсем понимаю для чего необходимо пользоваться ООП.
ООП используют для борьбы со сложностью. Это основа всех техник программирования - побороть сложность, сложную систему представить в простом виде.

georgiy_ya
Я понимаю, что всё в Python'е объекты, то есть экземпляры классов, так? Значит когда мы что то создаём мы создаём всего лишь экземпляр какого то класса, так?
В питоне почти всё является объектом (операции не являются). Ты не можешь передать операцию куда-то, чтобы она там была применена или сохранена. Это в лиспе можно так делать - превращать код в данные и данные в код. Да, в питоне ты работаешь с объектами, но ты их не создаёшь, они уже встроены в питон (в само ядро языка или в модули его).

В данном случае полиморфизм в питоне можно увидеть на примере:
  
>>> 2 * 3
6
>>> 2 * 'a'
'aa'
>>> 2 * [1]
[1, 1]
>>>
Операция умножения одна, но с разными объектами она меняет своё поведение полностью. Это вот то, для чего используется перегрузка функций в объектно-ориентированных языках. Здесь мы функцией считаем операцию умножения, которая перегружена. А перегружена - это значит, что в зависимости от сигнатуры вызова функции, применяется тот или иной вариант её реализации. Ну и, соответственно, в каждом варианте реализации можно написать его индивидуальное поведение (код). То есть операция используется одна, а её поведений можно наплодить кучу, и она будет сама понимать (по аргументам в вызове), какой вариант из своих реализаций выбирать.

То есть фактически твоё ООП заключается в чём: ты создаёшь описания объектов, потом по этим описаниям создаёшь сами объекты и они (твои объекты) взаимодействуют с питоновскими объектами. И получается, что и твои объекты, и питоновские объекты образуют единый процесс общения между объектами, в результате которого ты получаешься свои какие-то результаты. Они все одинаково участвуют в этом процессе и никакой из них не является важнее другого, они все важны.
georgiy_ya
Rodegast
Это всё я конечно же понимаю. Вы очень подробно всё описали, новичку это очень поможет.
georgiy_ya
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)
Писал на скорую руку и много чего не учёл\пропустил, так как тупо было лень всё это описывать. Да и вообще, мне кажется что это говнокод.

з.ы А вы умеете давать людям мотивацию
georgiy_ya
py.user.next
Мне кажется что ООП очень сильно усложнили в плане понимания. Зачем термин “Перегрузка операторов” назвали именно так? Почему не “Переопределение операторов”? По сути, это именно “переопределение оператора”, а не его перегрузка. Вообще слово “перегрузка” вызывает у меня асоциацию с перегрузом какого либо товара, а не с тем, что “на оператор падает что-то сверху”. Ещё например: зачем 2 одинаковых слова: экземпляр класса и объект? Или же всё таки какое-то отличия между ними есть? Сколько тайн ещё хранит в себе это долбанное ООП? Саму концепцию ООП слишком уж усложнили и навеяли много шума вокруг неё, из-за этого страдают простые новчики.
FishHook
georgiy_ya
перегрузка и переопределение в ООП означают совершенно разные вещи. Питон - далеко не единтсвенный ООП язык, он использует общую терминологию, но реализует далеко не все фишки других языков. Поэтому “перегрузка” и “переопределение ” в питоне одно и то же, а в Джаве - нет.
georgiy_ya
FishHook
А насчёт объектов и экземпляров?
Rodegast
> я подготовил лишь каркас.

У тебя только класс для автомобиля, а ведь ещё и трасса есть. Трасса имеет ровные участки и повороты, на поворотах надо тормозить, а на ровных учатках разгоняться.

> А насчёт объектов и экземпляров?

Сам класс является объектом, но не является экземпляром класса.
py.user.next
georgiy_ya
Зачем термин “Перегрузка операторов” назвали именно так? Почему не “Переопределение операторов”? По сути, это именно “переопределение оператора”, а не его перегрузка.
Перегрузка называется так потому, что на одно имя вешается несколько разных функций и они все работают. То есть имя одно, а функции разные на нём. В питоне нет перегрузки функций, её можно делать только обходными путями. В питоне только переопределение есть - это замена одной функции на другую под одним именем. Тебе даже в книгах по питону могут писать, что это перегрузка, но это не перегрузка, а переопределение. А перегрузка в классическом виде есть и в Java, и в С++, и в других языках.
Здесь можешь пример перегрузки на C++ посмотреть. А операции - это такие функции, просто у них имена как бы односимвольные и скобок не надо ставить при вызове, потому что язык их сам ставит.

georgiy_ya
Ещё например: зачем 2 одинаковых слова: экземпляр класса и объект?
Название “экземпляр класса” подчёркивает, что есть класс. А когда мы говорим “объект”, то нас его класс не интересует. Это синонимы (типа как “радоваться” и “смеяться”), которые придают определённый оттенок сказанному.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB