Я начинаю в этом программировании, и я попадаю в ООП. В питоне почему в классах ставится __init__
?. И это может показаться глупым, но зачем использовать классы, когда можно использовать функции?
Я начинаю в этом программировании, и я попадаю в ООП. В питоне почему в классах ставится __init__
?. И это может показаться глупым, но зачем использовать классы, когда можно использовать функции?
Этот метод
__init__
является специальным методом и примерно эквивалентен тому, что известно как конструктор в других языках. Его основная функция состоит в том, чтобы установить начальное состояние в объекте сразу после его создания, то есть инициализировать атрибуты.Некоторое время назад я сделал довольно обширный ответ об
__init__
этом и его функции в Python, я оставляю вам ссылку, чтобы не повторять одно и то же:Что такое конструктор?
Что касается вашего второго вопроса, почему бы не использовать всегда структурированное программирование и не усложнять себе жизнь этой классовой штукой?
Ну, вы должны начать с того, чтобы не усложнять себе жизнь без необходимости, ООП не всегда лучший вариант, это не имеет особого смысла, если я хочу создать функцию, которая возвращает куб числа (просто и ясно) начать создание класса с его методом, создать его экземпляр и т. д.
Однако ООП создано не для того, чтобы заставить нас страдать, в некоторых случаях оно очень полезно, а в других практически необходимо, например, при создании графических интерфейсов или видеоигр. Есть много преимуществ и отличий ООП по отношению к структурному программированию, но изучение этого никогда не заканчивается.
В ООП все вращается вокруг
objeto
. Объект — это сущность, имеющая определенное состояние, поведение (метод) и идентичность. Объект в ООП мало чем отличается от "объекта" реального мира, например, у человека есть определенное состояние (это я пишу), поведение (как человек, я могу ходить, пить, спать, скучать, пишите это, чтобы не было скуки XD и т.д.) и у меня есть личность (я это я и никто другой....).Состояние объекта (экземпляра) определяется его
atributos
. Они представляют собой не что иное, как данные (переменные), описывающие текущее состояние объекта.Поведение задается методами . _ Эти методы позволяют объекту что-то делать (ходьба, запись, включение питания и т. д.).
Идентичность — это свойство экземпляра, позволяющее отличить его от любого другого. Объект всегда можно дифференцировать, даже по отношению к объектам одного и того же класса.
В структурном программировании процедуры и данные разделены и не связаны между собой, поскольку единственное, что требуется, — это обработка одних входных данных для получения других выходных данных. Идея очень проста, у меня есть одни данные и я хочу получить другие, для этого я создаю функцию, передаю им и она возвращает мои новые данные. В ООП состояние (данные) не отделяется от методов (процессов), понятие человека не имеет смысла, если мы разделяем их состояние и методы. Если этот человек находится в коме, есть много методов (вещей, которые человек может сделать, чтобы быть человеком), которые он не сможет сделать, это не то же самое, что ходить (метод), если у меня сломана нога. (состояние) как будто нет...
То есть в ООП мы сначала определяем объект, а потом просим его что-то сделать самому.
После этого абзаца практический пример того, почему существует ООП. Как я уже упоминал при создании графических пользовательских интерфейсов, эта концепция очень важна. Очень распространенной вещью в графическом интерфейсе является кнопка. Нам понадобится много кнопок, каждая по-своему (цвет, текст, действие при нажатии и т. д.). Если нам нужно 200 кнопок, мы можем развлечься, создав каждую из них с нуля, каждая со своими собственными функциями, и в конечном итоге постараться. Затем ООП приходит к нам, как ангел-спаситель, и говорит нам: создайте класс Button, определите его атрибуты (текст, размер, цвет и т. д.) и то, что он может делать (щелчок, перезапуск, изменение цвета, исчезновение из поля зрения и т. д.). ). Затем вы создаете свои 200 кнопок, создавая экземпляр класса и придавая каждой из них свою индивидуальность (но все еще оставаясь кнопкой). Как глупый пример:
Пример очень простой, но хороший, давайте посмотрим, уловит ли он идею. Теперь я могу создавать нужные кнопки с минимальными усилиями, я просто создаю их экземпляры:
Теперь у меня есть две кнопки, обе разные, и обе делают то, что должна делать кнопка:
Пример простой, но близкий к реальности. Обратите внимание, что кнопка не ограничивается выполнением функций, а действует по-разному в зависимости от своего состояния (в данном случае, от того, отключена она или нет). В реальных реализациях это намного сложнее, представьте, что вы делаете это без ООП, вы можете попробовать...
Когда вы используете Python, вы используете это много раз, не осознавая этого. Список — это не что иное, как класс, у него есть свои атрибуты (например, содержимое) и свои методы (сортировка, извлечение, добавление и т. д.). Выполнение
miLista = [1,2,3]
— это не что иное, как создание экземпляра классаList
и создание начального состояния. Если мыmyLista.append(4)
используем один из его методов, список может увеличиваться и сохранять другой элемент.Продолжая мои великолепные аналогии, чтобы закончить, когда человек рождается (создается экземпляр), он делает это с рядом характеристик, которые отличают его от остальных (атрибутов), таких как цвет волос, цвет глаз, пол и т. д. Метод
__init__
делает то же самое, как только объект рождается, он придает ему ряд собственных характеристик, изменяя его атрибуты. Звучит глупо, но это способ мышления ООП, и он очень похож на то, как мы структурируем реальный мир.Ну оставлю это здесь, как объект класса
SerHumano
выполняю методdejar_de_dar_la_brasa()
и передаю свой атрибут обратноaburrido
вTrue
... XDКлассы — это способ генерировать объекты, ООП — это объектно-ориентированное программирование, если вы хотите использовать эту парадигму, вы должны думать об объектах и классах.
класс определяет тип объекта, когда вы его вызываете, вы создаете экземпляр этого класса, когда вы хотите, чтобы что-то произошло, вы вызываете этот объект и говорите ему сделать это.
__init__
это конструктор вашего класса, в котором вы создаете новый экземпляр класса, напримерЗачем использовать объекты, когда можно использовать функции, чтобы не перепутать несколько похожих объектов.
Давайте представим бота, который обслуживает 20 клиентов. Вы не хотите, чтобы бот отвечал клиенту 20 на вопрос клиента 18, поэтому вы создаете 20 объектов бота и назначаете каждому клиенту клиента.
в игре вы хотите создать 100 врагов, и каждый из них действует одинаково, но вы хотите, чтобы у каждого из них были характеристики, которые их отличают, поэтому вы создаете класс врагов и реализуете характеристики, которые их отличают.
Предполагается, что ООП был создан, когда у авиасимуляторов начались проблемы с дифференциацией одного самолета от другого в симуляции.
Я новичок в программировании вообще, а значит и в питоне.
Новички задают явно «тупые» вопросы, потому что каждый знак, букву, комбинацию, которые мы видим в строке кода, мы просто не понимаем, потому что все для нас новое.
Когда я читаю такие сложные ответы на такой простой вопрос, я понимаю, что, не знаю почему, но это похоже на то, что ответ на что-то простое с помощью чего-то простого становится чем-то сложным.
Я думаю, что то, что хотел узнать этот мальчик, это то, что я хотел узнать, и теперь он дает мне, что я понял это, чего я не понимаю, так это почему это нигде не объясняется прямо и без такого большого «броска», для чего __init__ работает практически, правда в том, что это безумие, потому что это глупо, но я вижу только мега-искаженные ответы на различных форумах и 5-страничных интернет-статьях, которые в конечном итоге остаются такими же, как в начале.
Для меня прямой ответ, объясняющий использование «__init__» в классе, будет примерно таким:
Когда вы создаете класс с намерением сделать из него много объектов (экземпляров класса), которые всегда будут иметь определенные общие характеристики, самый простой способ сэкономить работу при создании каждого объекта, созданного с использованием этого класса, — это когда эти объекты которые вы создаете, имеют характеристики (свойства) и значения (аргументы) по умолчанию, поэтому вам не нужно назначать эти характеристики объекту каждый раз, когда вы создаете объект.
Когда вы используете функцию __init__ в классе, вы определяете свойства и аргументы по умолчанию, которые будут иметь созданный объект.
Здесь я объясняю это на примере:
Если вы создадите класс транспортных средств и из него вы собираетесь создать 2000 транспортных средств (машин-объектов), и вы знаете, что по умолчанию большинство объектов транспортных средств, созданных с помощью этого класса, вероятно, будут четырехколесными, это будут внедорожники, они будут иметь дизельный двигатель и ABS, потому что вы определяете в классе с помощью функции __init__ , и это будут характеристики по умолчанию, которые будет иметь этот объект при его создании с использованием этого класса, на практике:
(«Я» — это в основном объект, который создается из самого класса, поэтому они так его и называют, я думаю, было бы лучше понять, если бы слово объект использовалось таким образом: «object.wheels = Wheels»)
Теперь я создаю объект, который я называю car_1, из класса транспортного средства следующим образом:
Если я хочу узнать, сколько колес у этой машины, я могу вывести колеса, которые есть у (объекта), получится 4:
если я хочу узнать, есть ли в машине АБС (получится True):
Потому что это то, что я определил в классе транспортного средства с помощью функции __init__ , то есть объекты будут __init__cialized (созданными) с этими параметрами.
Теперь, если я хочу создать машину без АБС (потому что я хочу посмотреть, как она скользит под дождем при торможении в повороте), то я создаю машину (объект) и удаляю АБС следующим образом:
Итак, теперь у меня есть машина без АБС (помните, что если я ничего не скажу, по умолчанию новый автомобиль объекта будет иметь АБС), и я проверяю это следующим образом:
Если я хочу создать автомобиль с электродвигателем вместо дизельного по умолчанию, я могу создать его следующим образом:
И при печати той характеристики той машины выйдет, что она электрическая:
Мне понадобилась неделя, чтобы понять эту чушь, потому что для таких смертных, как я, это нигде не объясняется, должно быть, я очень глуп или другие очень умны, я не знаю.
Вызов «def», а не «fun» при создании функции не упрощает задачу (возможно, «fun» — это весело, а программисты должны выглядеть серьезно).
«Я» — еще одна шутка, чтобы создать впечатление, что инициализация объекта в классе — это то, что понимают только люди, работающие в НАСА. Если бы вместо того, чтобы называть это «я», они назвали бы это «объектом», это было бы самоочевидно, и каждый понял бы это без необходимости объяснять...
В любом случае, когда я закончу понимать все, я напишу какую-нибудь книгу или какой-нибудь учебник, который я назову, который будет объяснять простые вещи простым способом, а не ответы на 14 страниц, которые не понимает ни один бог.
АМИНЬ