Найти - Пользователи
Полная версия: ООП
Начало » Python для новичков » ООП
1 2 3
HLpmpls
Здравствуйте, я новичок в программировании.
Недавно начал изучать ООП.
Объясните, пожалуйста, зачем нужен аргумент self при создании метода?
Я написал простой код ( с self и без него)
-
  [s][/s]
class Person():
    def Hello(self):
        print ('Hello')
p1 = Person()
p1.Hello()
_______________
       
class Person():
    def Hello():
        print ('Hello')
p1 = Person
p1.Hello()

Оба кода работают нормально, ошибок нет. Зачем нужен этот аргумент self, если и без него все работает нормально
(и еще, поясните, почему при постановке в конце строчки p1 = Person двух скобок() во втором варианте кода выдается ошибка)

FishHook
HLpmpls
Классы сами по себе бессмысленны. Класс - это новый тип данных. Тип не имеет значения если вы не создаете объектов. В вашем коде вы создаете объект p1, но этот объект тоже довольно бесполезен, потому что он не содержит внутренней структуры. Другими словами, ООП в вашем примере не работает никак и ваш код не лучше простого объявления функций вне всяких классов
 def Hello():
        print ('Hello')
Hello()
Чтобы разобраться, создайте более продуктивный пример, а именно вам нужны объекты с каким-то состоянием. Например, создайте библиотеку геометрических примитивов (Круг, Квадрат, Треугольник). Каждый из классов должен иметь метод getArea()
HLpmpls
FishHook
HLpmplsКлассы сами по себе бессмысленны. Класс - это новый тип данных. Тип не имеет значения если вы не создаете объектов. В вашем коде вы создаете объект p1, но этот объект тоже довольно бесполезен, потому что он не содержит внутренней структуры. Другими словами, ООП в вашем примере не работает никак и ваш код не лучше простого объявления функций вне всяких классов

То есть, допустим, я должен создать класс “прямоугольник”, создать метод для вычисления его площади, сохранить в атрибутах его длину, ширину и т.д?
FishHook
HLpmpls
То есть, допустим, я должен создать класс “прямоугольник”, создать метод для вычисления его площади, сохранить в атрибутах его длину, ширину и т.д?
Ага!
Вот такое должно получиться
    
class Square:
    # your code here
class Circle:
    # your code here
shapes = [Square(10, 20), Circle(50), Circle(56), Square(15, 17)]
for shape in shapes:
     print shape.getArea()
py.user.next
HLpmpls
Здравствуйте, я новичок в программировании.
Недавно начал изучать ООП.
ООП без OOA и OOD лучше не изучать. Потому что сначала у тебя есть задача. Для задачи проводится OOA (объектно-ориентированный анализ), потом результаты OOA передаются в OOD (объектно-ориентированное проектирование, d - design) и обогощаются новыми данными, потом результаты OOD передаются в OOP (объектно-ориентированное программирование) и уже записываются на каком-либо ООП-языке программирования.

Без этого всего ничего ты не напрограммируешь. Это как язык программирования не делает программу, так и объектно-ориентированное программирование не строит объекную модель. Это как карандаш не рисует рисунок, так и кисти и краски не пишут картину. Если обезьяне дать кисти и краски, она не нарисует портрет, хотя рисовать будет очень много и долго.
HLpmpls
py.user.next
Спасибо за совет. Почти во все книжках для начинающих нет таких тем (ООА и ООD). Обычно, сразу после функций начинают рассказывать про классы и ООП.
FishHook
HLpmpls
Обычно, сразу после функций начинают рассказывать про классы и ООП.
Вот и читайте книжку, не стоит все подряд высказывания принимать за откровение.
py.user.next
HLpmpls
Обычно, сразу после функций начинают рассказывать про классы и ООП.
Ты ничего не напишешь в ООП. Почему ты не напишешь? Потому что ты не сможешь построить иерархию классов.

Вот просто введи слово object в питоне
  
>>> object
<class 'object'>
>>>
Вот он выводит, что это класс такой. А зачем он нужен? Вот ты задайся этим вопросом и ты не найдёшь ответа. Почему? Потому что читаешь книжки такие. Ты там поищешь, там тебе напишут “это просто так надо, это просто так заведено”.
Соответственно, вот это всё “я новичок, но начал с ООП, потому что мне вот пишут что-то там, что сейчас ООП модно” - это сказки для дурачков. Ничего ты не будешь писать в ООП, так как это обширная тема. Это не просто научиться в питоне слово class записывать.
FishHook
py.user.next
Ну и что ты предлагаешь то? Давай закроем нафиг “Питон для новичков”. Как-то ты камрад неконструктивно и не по делу умничаешь. Человек читает учебник. Видит непонятное и спрашивает. Его вопрос не простирается за пределы учебника, ему не нужны ни иерархии классов, ни анализ и ни проектирование. Ему надо понять, что значит класс, метод и экземпляр. Чо ты его грузишь то?

HLpmpls
Не слушайте. Читайте учебник, выполняйте задания, всё будет своим чередом.
py.user.next
FishHook
Ну и что ты предлагаешь то?
Начать с определений. Он не знает, что такое ООП.

FishHook
Давай закроем нафиг “Питон для новичков”.
Оно для новичков, но не для дурачков.

FishHook
ему не нужны ни иерархии классов, ни анализ и ни проектирование
Без иерархии классов нет ООП. Ты вообще понимаешь, что когда ты просто класс сделал (да даже сто классов ты сделал), это не ООП, это программирование с абстрактными типами данных просто? В ООП все объекты в программе - родственники. Ближайшие родственники или дальние. И за счёт этой родственности происходит перенос общих признаков, которые не нужно каждый раз заново реализовывать. То есть ты громадные конструкции можешь очень быстро воспроизводить. Вот почему ООП считается подходящей парадигмой для разработки огромных программ (больше 100000 строк). Там просто можно ворочать огромными кусками очень быстро, перенастраивать их с одного на другое.

Так что это не кружок сделать и не квадратик. Это обширная область, где нужно прочитать кучу разных книжек.

В питоне же за счёт ООП достигнута перебираемость объектов разных типов цикле for, например. Как они так догадались, что можно сделать так, чтобы в цикле for можно было одинаково перебирать и список, и словарь, и строку, и генератор, и открытый файл, и вообще ещё можно свою какую-то штуку сделать, которой нет в питоне, чтобы её тоже там можно было перебирать? Вот это сделано через ООП. Эти классы - потомки класса итерабл (что-то перебираемое). А цикл for - это объект-клиент, взаимодействущий с перебираемым объектом-сервером через протокол перебираемости. Формально цикл for в питоне объектом не является, но с точки зрения ООП процесс идёт именно вот такой - два объекта общаются через сообщения; цикл общается с тем, что он перебирает. Просто это не формализовано, так как вместе с этим и цикл придётся сделать родственником того, что он перебирает, а для этого нужно пораскинуть мозгами, попроектировать. И это обязательно нужно делать, а не просто так, по желанию левой пятки. А в Паскале попробуй перебери что-нибудь в цикле кроме заданного там изначально формата. Питон обходит Паскаль потому, что он объектно-ориентированно устроен. Он и меняется легко, не заморожен, и взаимодействовать с ним легко, потому что всё абстрактно, выведено в интерфейсы. Элементы твоей программы общаются с элементами питона, образуется кооперация объектов.


tags: oop
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