Про инкапсюляцию (она есть). На моменте 17:45, обращение к полю year дало результат, так как вы добавляли нижние подчеркивания в названии переменной, у которой оставалось значение None, а в конструкторе создавали новое поле класса. Плохо выражаю свои мысли, если короче, у нас просто у объекта в тот момент было два поля: year и __year. К полю __year мы не могли обратиться, так как оно инкапсулировано, но к полю year мы спокойно обращались. Это два разных поля
12:04 class School(Building, House) выдаёт ошибку, потому что House тоже наследует от Building. Происходит конфликт порядка методов, т.к. наследуется одно и тоже, а так множественное наследование разрешено в питоне.
Мммм... Я вот нашел немного другую инфу об инкапсуляции: поле __name, к примеру, не нужно прописывать в классе, его необходимо инициализировать и определять непосредственно в конструкторе. Тогда оно не будет доступно извне, только внутри класса и через методы. Да, это немного неудобно, не так как в тех же шарпах, но я попробовал и работает нормально.
Теория ООП - это отдельная большая тема, за 2-3 коротких видео объяснить не реально. Было бы странно, если бы ты с нуля за 2-3 коротких видео хоть что-то понял. Эти уроки(18-19) для тех, кто уже знает ООП на другом языке, а тут просто знакомится с синтаксисом питона.
Толи примеры неудачные. Как по мне, это какой-то очередной костыль/инструмент. Завуалированая работа с данными. Сделать список например для каждого здания, и править по мере необходимости нужные параметры. Не тоже ли самое получится...? Выглядит более удобоваримо, и не более. Тоесть, навыдумывали кучу способов выборки данных. Не починили глюки с открытием файла, а придумали другую открывалку. Единственный бонус питона, что в массивы можно пихать данные разного типа. От остальной мишуры понту нету. Тоже самое можно и на бэйсике сформулировать.
Кстати, в Python 3 вместо super(School, self)(и так далее) нужно просто писать super() , но если вы работаете на пайтон 2 - Продолжайте писать super(School, self)
Я израсходовала допустимый ресурс своей черепной коробочки... Я прям встряла в середине, запуталась и усе.... Пересмотрела, но понятнее не стало. На самом сайте урок про наследование мне показался гораздо понятнее и разжеваннее что ли ) Спасибо за урок, у меня остался один шаг до завершения курса.
У C# есть множественное наследование. И это супер удобная вещь. Ты можешь создать несколько интерфейсов по типу IFly, IRun, IEnemy. И создавать классы, которых будет объединять например интерфейс IFly и IEnemy. То есть ты создаешь летающих врагов. Так же можешь использовать IFly например на классе животных, чтобы определить летающих животных. А не создавать отдельные классы по типу FlyingEnemy или FlyingAnimal.
Говорили классы это хорошо, классы это экономия времени)) для того чтобы вывести информацию снизу пришлось написать около 40 строчек кода) Year: 1999 City: New-York Pupils: 100 Year: 2001 City: Washington Doctors 15 Year: 2005 City: New-York Sellers: 4
Теперь представь, что твоя программа - это реестр зданий страны. Тогда уже не весело будет. И классы - это не про вывод информации, а удобный способ работать с логически связанными объектами
я конечно спорить не хочу, так как сам только начинающий, но как по мне он нормально объясняет сложние темы, да бывает что чуть-чуть не договаривает но как для начинающих норм😊
Когда прописал все для вывода числа учеников и запустил программу,мне выдало ошибку связанную с self ну я значит смотрю что не так,сидел мин 8-точно,в итоге оказалось что я написал в методе get_info не self а slef😂так сразу ведь и не заметишь,особенно если у тебя много функций внутри класса/классов и self приходиться писать везде
А ничего что множественное наследование в питоне есть? Ты можешь в классе School(Building) написать запятую и указать ещё один какой-то класс родитель. С инкапсуляцией тоже пример доведен до абсурда.
По поводу инкапсуляции - А что если попробовать реализовать приватные данные посредством кортежей? В момент срабатывания метода выводить срез с нужной информацией в новую переменную, производить действия внутри метода, и по окончанию присваивать этой переменной значение None?
@@VitaliyZlobin разработчики питона не дураки, раз разрешили эту фичу, им виднее. некоторые вещи можно нормально только через множественное наследование решить - например класс автомобиль-амфибия от автомобиля и судна
@@w1944w1944 перечитай мой коммент, там нет про дураков и полный отказ от множественного наследования. Кстати, разработчики Java и C# тоже не дураки, однако в этих языкам от множественного наследования осознанно отказались.
@@VitaliyZlobin правильно, там осознанно отказались и придумывают сейчас всякие костыли и обходные пути, вместо того, чтобы решать задачу прямым и очевидным способом.
у меня вопрос касательно 14:35 минуты Почему мы при обращении к конструктору основного класса внутри скобок ф-ции super() указываем класс наследник через который обращаемся, а при обращении к методу основного класса не указываем класс наследник?
И правда... Ну есть же множественное наследование! Посмотрел весь курс, и он просто прекрасен! Но вот то, что автор говорит, что в языке нет множественного наследования(а по факту оно есть, и код приведенный выше действительно работает), меня, как новичка, очень сильно сбило с толку.
У меня почемуто на выводе финального кода в терминале задваивается инфа + показывает кол-во "учеников" сначала то что по умолчанию (0), а потом вконце то что я указал. Почему так?
11:22 Поправка: Класс может иметь сколько угодно родителей, НО порядок должен быть такой: родитель-наследник, родитель. Но смысла в этом нет, если родитель у родителя-наследника и у нового класса наследника будет одним и тем же классом. Ибо у родителя-наследника и так уже доступ к методам их общего родителя
Действительно, в Питон есть множественное наследование (сколько угодно родителей). Не знаю, было ли так с самого начала, но множественное наследование точно было уже во 2-м Питоне. Если у всех родителей есть одноименный атрибут (свойство(поле) или метод), то какой же из них использовать? Чтобы это решить, классы перебираются в определенном порядке, до тех пор пока это имя не будет найдено в каком-то классе. Т.е. существует особый маршрут поиска (MRO) по "генеалогическому древу" классов. Упрощенно такой: "сначала смотрим у себя, потом у всех своих родителей слева направо, потом у всех дедушек, у всех прадедушек и т.д." Посмотреть этот маршрут можно методом mro(). Например, "bool.mro()" выведет [, , ]
Потому что автор не понимает ничего, посмотрел второсортные уроки по ООП и считает себя мастером, да ещё и других пытается учить. Он уже в начале видео засирает память бесполезными данными. Чтобы Вы понимали, он создаёт 2 статических свойства year и city, а так же создаёт ещё 2 свойства точно такие же, только уже в инициализаторе класса и являются они уже локальными свойствами. Тем самым при создании экземпляра у него в памяти будет храниться 4 свойства, а не 2. Он думает, что если вне __init__ указал свойствам значения None, то свойства в инициализаторе будут принимать эти значения, а по факту нет, т.к повторюсь, в памяти у него будет 4 свойства, 2 статический свойства и 2 локальных свойства. Правильным вариантом действительно было бы сделать так как Вы говорили, определить дефолтные параметры в инициализаторе классе, т.е в __init__.
@@sogorich Не пойму с чего такие выводы. Начнем с того, что понятие "статическая переменная" в python - отсутствует. Можно лишь реализовать её аналог. А если и реализовывать её аналог, то явно с помощью методов, но никак не с помощью конструктора (инициализатор класса, если вам так будет угодно). Так и при чем, если судить по вашей логики, то они относятся к разной области в памяти, но как бы не так, они имеют один участок памяти, если не верите - проверьте через дебаггер с удобной для вас IDE.
@@arashitaxe8101 Не переменная, а свойство. Свойство определенное в классе изначально ведёт себя как статическое, если не имеются реализованные методы класса для этих свойств (@classmethod). Свойства определенные в классе возможно изменить только через методы класса, о которых я сказал выше, если вы пытаетесь, например, обращаться к ним через self, то они доступны будут только для чтения, если вы запишите туда другое значение Вы не измените это свойство класса, а создадите новое, которое будет в пространстве имён экземпляра, а не класса. В этом легко убедиться используя магический метод __dict__
А, если мне надо убрать year или city из class School. То что мне надо сделать? Просто убирая из конструктора эти параметры, то мне выходит ошибка, о том, что я убрал, того не хватает
суть параметра наследования в том - чтобы наследовать все данные от класса 'Building", поэтому в данном случае, тебе нужно перестать принимать параметр 'Building" и делать всё отдельным классом
По всей видимости поняли что инкапсуляция в ооп излишне. Защита данных от себя самого или своей команды это тупость))) когда это пригождалось если не мешало. Гораздо чаще получается что приватные поля или классы приходится в будущем переделывать особенно если модуль расчитан на доработку)))
есть вопрос, почему в видео сработал ввод super(school, self).__init__(year, city) self.pupils = pupils в моем случае оно не работало пока я сначала не обозначил self.pupils = pupils и только потом super(school, self)...и тд подскажите пожалуйста
от мне непонятно если у меня просто класс, я создаю на его основе обджект, и если я не прописал в def __init__ (year=None, city=None), то я обязан эти значения указать при создании обджекта, иначе у меня вылезет ошибка, а вот если у меня класс наследуется от класса, и я в наследнике НЕ прописываю в def __init__ super(School, self).__init__(year, city), получается я могу создать школу (напомню что year=None, city=None в def __init__ я НЕ прописывал), у которой не будет года и города, а будут только ученики, и никакой ошибки. объясните плиз как так и почему? это странно (имхо) заранее спасибо и прошу прощения если вопрос тупой (я нуб).
Здравствуйте мне 17 лет и я создал телеграмм канал, где показываю с какими трудностями я сталкиваюсь при изучении языков программирования с нуля. Также объясняю как решать эти проблемы. К каналу есть чат, где я отвечаю на интересующие вас вопросы, если заинтересовало ставь +
Тема наследования не раскрыта. Если указать class House(School) и указать house = House(3, 2000, 'Moscow'), то при запуске выскочит ошибка "TypeError: super() argument 1 must be a type, not School" . Запись super().__init__(year, city) данную ошибку убирает и всё работает.
2:27 я когда пытаюсь ввести данные в скобки (как на видео, например, 2000 год) у меня выдает ошибку Building() takes no arguments, хотя код списал с видео. в чем прикол? )
@@melancholic_017 class Building: yearr = None cityy = None def __int__(self, yearr, cityy): self.yearr = yearr self.cityy = cityy def get_info(self): print('Y:', self.yearr, 'C:', self.cityy) school = Building(и вот в этом месте когда пишу значения выдает ошибку. И pycharm выделяет написанное мол у меня не все хорошо)
Инкапсуляция не реализована, потому что туфта. Какая разница как получать доступ на прямую или через гетеры и сетары. Согласен, нужно закрыть к тем полям, которые работают внутри класса, типа локальные И тем, которые не должны меняться никогда. Остальным смысл нет. А то как заученную библию трындите не задумываясь.
Боги, почему ты через каждую минуту говоришь "давайте ВОЗМОЖНО сделаем то" или "давайте ВОЗМОЖНО сделаем это"? Ты после этого ЯВНО прописываешь то, о чём только что говорил. Это уже не "возможно", это "определённо"! Андэстенд ми?
7:47 pupils - количество учеников 😄 сорян, но это слово переводится немного не так, это зрачки, произнёс правильно, а записал нет, people, так нужно было. Без обид, это придирка, по факту можно хоть тра-ля-ля назвать, но нейминг действительно важен и good code лучше с самого начала прививать себе, ибо иногда это может очень плохо аукнуться в больших проектах, имхо... UPD: извиняюсь, за то, что ложно обвинил автора в некорректности перевода, сорри... Мне указали на мою же ошибку ; (
О_о спасибо, просто изначально в гугле и проверил, там зрачки выдало, а если да, глубже глянуть, действительно, учащиеся, ну либо синоним студенты, хм-м-м, реально спасибо за то, что указали на мою же ошибку 👍🏻 Автору приношу извинения за то, что я сам некорректно перевёл слово...
Парень, молодец, отлично объясняешь, и, главное, по порядку, по полочкам, ничего не пропуская! спасибо тебе!
Тема довольно сложная, но вы умеете объяснять всё максимально понятно и доступно.
Сложная тема, но все очень подробно и понятно. С инкапсуляцией остались вопросы ещё. А в остальном все прям очень четко. Спасибо!
Про инкапсюляцию (она есть). На моменте 17:45, обращение к полю year дало результат, так как вы добавляли нижние подчеркивания в названии переменной, у которой оставалось значение None, а в конструкторе создавали новое поле класса. Плохо выражаю свои мысли, если короче, у нас просто у объекта в тот момент было два поля: year и __year. К полю __year мы не могли обратиться, так как оно инкапсулировано, но к полю year мы спокойно обращались. Это два разных поля
12:04 class School(Building, House) выдаёт ошибку, потому что House тоже наследует от Building. Происходит конфликт порядка методов, т.к. наследуется одно и тоже, а так множественное наследование разрешено в питоне.
pupils довольны)
Мммм... Я вот нашел немного другую инфу об инкапсуляции: поле __name, к примеру, не нужно прописывать в классе, его необходимо инициализировать и определять непосредственно в конструкторе. Тогда оно не будет доступно извне, только внутри класса и через методы. Да, это немного неудобно, не так как в тех же шарпах, но я попробовал и работает нормально.
У меня точно так же, но я это открыл эксперементальным путём.
Спасибо, посмотрела!
Подписался на платные курсы. Но там рассказывается все сухо. Подписался на этот канал и понял что как и откуда берется.
А вот это сложноватый урок,но мы не сдаемся)
тот что ранее вообще не понятно
Теория ООП - это отдельная большая тема, за 2-3 коротких видео объяснить не реально.
Было бы странно, если бы ты с нуля за 2-3 коротких видео хоть что-то понял.
Эти уроки(18-19) для тех, кто уже знает ООП на другом языке, а тут просто знакомится с синтаксисом питона.
Смотри видео. Нужно понять саму логику и дойти к данному уровню абстракции, это не сложно. Сделай себе ассоциации, и всё будет в порядке.
Наоборот достаточно легко,у меня вот наоборот с конструктором __init__ какие то ошибки возникали,а тут достаточно легко объяснили
Толи примеры неудачные.
Как по мне, это какой-то очередной костыль/инструмент.
Завуалированая работа с данными.
Сделать список например для каждого здания, и править по мере необходимости нужные параметры.
Не тоже ли самое получится...?
Выглядит более удобоваримо, и не более.
Тоесть, навыдумывали кучу способов выборки данных.
Не починили глюки с открытием файла, а придумали другую открывалку.
Единственный бонус питона, что в массивы можно пихать данные разного типа.
От остальной мишуры понту нету.
Тоже самое можно и на бэйсике сформулировать.
Кстати, в Python 3 вместо super(School, self)(и так далее)
нужно просто писать super() , но если вы работаете на пайтон 2 - Продолжайте писать super(School, self)
Спасибо, долго не мог понять эту тему пока не посмотрел этот ролик!
лучший просмотрел все 19 уроков кайф
Я израсходовала допустимый ресурс своей черепной коробочки... Я прям встряла в середине, запуталась и усе.... Пересмотрела, но понятнее не стало. На самом сайте урок про наследование мне показался гораздо понятнее и разжеваннее что ли )
Спасибо за урок, у меня остался один шаг до завершения курса.
У C# есть множественное наследование. И это супер удобная вещь. Ты можешь создать несколько интерфейсов по типу IFly, IRun, IEnemy. И создавать классы, которых будет объединять например интерфейс IFly и IEnemy. То есть ты создаешь летающих врагов. Так же можешь использовать IFly например на классе животных, чтобы определить летающих животных. А не создавать отдельные классы по типу FlyingEnemy или FlyingAnimal.
Если ты говоришь про С# в играх то это может быть сделано с библиотекой
Называется это интерфейс
в Python тоже есть множественное наследование, хз, почему он здесь говорит, что его нет
Это было круто! Только с вашим уроком внятно понял, как устроен класс.
Я дошел до этого урока но ничего не понял. Скажите как вы тренеруетесь или надо все записывать или пересмотреть все сначала ?
@@Нунчаки-м8г Делать конспекты и заметки порой действительно очень полезно. Мне помогает.
@@Нунчаки-м8г записывать 1000% надо, плюс практика. Есть много сервисов в сети для практики на любом языке
"В питоне есть инкапсуляция но она реализованная не очень хорошо"когда показал на деле я засмеялся)
отрицательная реализация
Што смешного?
__@@eveel7427
Thank you so much !!! I like your explanation very much.
После прошлого урока думал что щас будет смерть, а тут всё приятно, просто и понятно :3
Говорили классы это хорошо, классы это экономия времени)) для того чтобы вывести информацию снизу пришлось написать около 40 строчек кода)
Year: 1999
City: New-York
Pupils: 100
Year: 2001
City: Washington
Doctors 15
Year: 2005
City: New-York
Sellers: 4
👍
Теперь представь, что твоя программа - это реестр зданий страны. Тогда уже не весело будет.
И классы - это не про вывод информации, а удобный способ работать с логически связанными объектами
А вот и сложности подъехали)
Ну что,как прогресс?
@@anchousgames_ у меня всë фигово
@@nabik309 а сейчас как?
@@Quadro154 сейчас весна
В Python ЕСТЬ МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ !!!
Хотел курсы купить, но после таких ляпов, сомневаюсь, что автор научит действительно чему - то стоящему
походу автор сам джуниор какой то, множественого наследования нет, инкапсуляция плохо реализована. Слышим звон не знаем где он.
через год этот плейлист соберёт миллионы прсмотров на каждом видео
Посмотрим 😁
Прошел год, с момента публикации видео, просмотров 20к)
даже сотни не собрал материал узко рассказан(
Сейчас 100 тысяч просмотров на этом видео.
@@itproger Факты
Талант, не иначе, спасибо большое
Начиная с версии python 3.0, метод super можно использовать без тех двух параметров.
спасибо, я после метода super убрал из скобок (название родительского класса, self) - сразу заработало все: super().__init__(year, type)
@@vladimirkazaev9931 честно скажу, херовый курс. Попробуй курс от Сергея Балакирева на степике
@@coffeeglek6773 согласен, особенно когда он сказал, что в питоне нет множественного наследования. Человек основ не знает и берётся других учить
@@w1944w1944 сейчас на курсе Сергея Балакирева с канала selfedu, советую.
я конечно спорить не хочу, так как сам только начинающий, но как по мне он нормально объясняет сложние темы, да бывает что чуть-чуть не договаривает но как для начинающих норм😊
Когда прописал все для вывода числа учеников и запустил программу,мне выдало ошибку связанную с self ну я значит смотрю что не так,сидел мин 8-точно,в итоге оказалось что я написал в методе get_info не self а slef😂так сразу ведь и не заметишь,особенно если у тебя много функций внутри класса/классов и self приходиться писать везде
Я вижу твой комментарий под каждым видео про пайтон!
А ничего что множественное наследование в питоне есть?
Ты можешь в классе School(Building) написать запятую и указать ещё один какой-то класс родитель.
С инкапсуляцией тоже пример доведен до абсурда.
Думал что с обновленной версией у меня там не работает. Но я просто забыл поставить запятую...
круто 😄
По поводу инкапсуляции - А что если попробовать реализовать приватные данные посредством кортежей? В момент срабатывания метода выводить срез с нужной информацией в новую переменную, производить действия внутри метода, и по окончанию присваивать этой переменной значение None?
Чел, ты гений
А где хранить этот кортеж? Если хранить его так же, как переменную, то кто-нибудь может в кортеж напрямую залезть и взять там данные.
а нельзя скачать доп.библиотеку илии фраймеворк,и не ломать себе мозг или я чего то не понимаю?
@@asdqwezxcrtyyy8922 я если честно, не очень понимаю само определение инкапсуляции, что оно подразумевает?
Наследовать можно и от 2-х классов, вроде видео свежее, а инфа порой сомнительная(
согласен, сам только что проверил
Множественное наследование - путь к бесконечному дебагу.
И зачастую оно говорит о том, что ты не смог спроектировать иерархию должным образом.
@@VitaliyZlobin разработчики питона не дураки, раз разрешили эту фичу, им виднее. некоторые вещи можно нормально только через множественное наследование решить - например класс автомобиль-амфибия от автомобиля и судна
@@w1944w1944 перечитай мой коммент, там нет про дураков и полный отказ от множественного наследования. Кстати, разработчики Java и C# тоже не дураки, однако в этих языкам от множественного наследования осознанно отказались.
@@VitaliyZlobin правильно, там осознанно отказались и придумывают сейчас всякие костыли и обходные пути, вместо того, чтобы решать задачу прямым и очевидным способом.
у меня вопрос касательно 14:35 минуты Почему мы при обращении к конструктору основного класса внутри скобок ф-ции super() указываем класс наследник через который обращаемся, а при обращении к методу основного класса не указываем класс наследник?
А зачем задавать полям city и year значение None? Если просто убрать эти строчки кода, то все будет также корректно обрабатываться. Или нет?
9:32 Для чего передаётся название унаследованного класса при обращении к конструктору родительского класса?
TypeError: Building.__init__() takes 3 positional arguments but 4 were given
Не могу понять почему выдает такую ошибку
В строке school=building(100, 2000, "Moscow') - замени building на school
а почему в видео показано по другому а тут по другому?
@@АннаБеляева-ч5п
Мне эти уроки дается легко потому что ранее изучал java
и в нем ООП.Если изучишь один язык прог то другие будут очень легкими 😅😅😅
а почему нельзя наследовать сразу с нескольких классов? вроде нормально работает
Множественное наследование - путь к бесконечному дебагу.
И зачастую оно говорит о том, что ты не смог спроектировать иерархию должным образом.
Потому что сделать не могут, а оправдываются что так плохо. Мля. Ты сделай, а программисты сами будут решать надо оно им или нет.
Крутоооооооооооо
Там есть уже множественное наследование
class Builder:
pass
class Buildering:
pass
class Build(Builder, Buildering):
pass
так что всё работает
И правда... Ну есть же множественное наследование! Посмотрел весь курс, и он просто прекрасен! Но вот то, что автор говорит, что в языке нет множественного наследования(а по факту оно есть, и код приведенный выше действительно работает), меня, как новичка, очень сильно сбило с толку.
@@jesman008 тебе как новичку для чего нужно множественное наследование?
У меня почемуто на выводе финального кода в терминале задваивается инфа + показывает кол-во "учеников" сначала то что по умолчанию (0), а потом вконце то что я указал. Почему так?
Я не понял для чего нужно наследие, если параметры можно просто назначить как None и менять их там где это нужно
Для удобства и иногда для уменьшения кода
При выводе информации. У меня между значениями не проставляется точка, почему?
Year: 2000 city: Москва pupils: 100
👍👍👍
Них*я не понятно, но очень интересно
зачем нужны вторая и третья строчки кода? код работает и без них. То же самое касается 17 и 18 уроков
Я буду тут каждый день. День 11
11:22
Поправка: Класс может иметь сколько угодно родителей, НО порядок должен быть такой: родитель-наследник, родитель.
Но смысла в этом нет, если родитель у родителя-наследника и у нового класса наследника будет одним и тем же классом. Ибо у родителя-наследника и так уже доступ к методам их общего родителя
Действительно, в Питон есть множественное наследование (сколько угодно родителей). Не знаю, было ли так с самого начала, но множественное наследование точно было уже во 2-м Питоне. Если у всех родителей есть одноименный атрибут (свойство(поле) или метод), то какой же из них использовать? Чтобы это решить, классы перебираются в определенном порядке, до тех пор пока это имя не будет найдено в каком-то классе. Т.е. существует особый маршрут поиска (MRO) по "генеалогическому древу" классов. Упрощенно такой: "сначала смотрим у себя, потом у всех своих родителей слева направо, потом у всех дедушек, у всех прадедушек и т.д." Посмотреть этот маршрут можно методом mro(). Например, "bool.mro()" выведет [, , ]
@@olegkomlev спасибо)
А какой смысл в шапке держать year и city, если они инициализированы? можно None в инициализации прописать же, нет?
Потому что автор не понимает ничего, посмотрел второсортные уроки по ООП и считает себя мастером, да ещё и других пытается учить.
Он уже в начале видео засирает память бесполезными данными. Чтобы Вы понимали, он создаёт 2 статических свойства year и city, а так же создаёт ещё 2 свойства точно такие же, только уже в инициализаторе класса и являются они уже локальными свойствами. Тем самым при создании экземпляра у него в памяти будет храниться 4 свойства, а не 2. Он думает, что если вне __init__ указал свойствам значения None, то свойства в инициализаторе будут принимать эти значения, а по факту нет, т.к повторюсь, в памяти у него будет 4 свойства, 2 статический свойства и 2 локальных свойства. Правильным вариантом действительно было бы сделать так как Вы говорили, определить дефолтные параметры в инициализаторе классе, т.е в __init__.
@@sogorich Не пойму с чего такие выводы. Начнем с того, что понятие "статическая переменная" в python - отсутствует. Можно лишь реализовать её аналог. А если и реализовывать её аналог, то явно с помощью методов, но никак не с помощью конструктора (инициализатор класса, если вам так будет угодно). Так и при чем, если судить по вашей логики, то они относятся к разной области в памяти, но как бы не так, они имеют один участок памяти, если не верите - проверьте через дебаггер с удобной для вас IDE.
@@arashitaxe8101 Не переменная, а свойство.
Свойство определенное в классе изначально ведёт себя как статическое, если не имеются реализованные методы класса для этих свойств (@classmethod).
Свойства определенные в классе возможно изменить только через методы класса, о которых я сказал выше, если вы пытаетесь, например, обращаться к ним через self, то они доступны будут только для чтения, если вы запишите туда другое значение Вы не измените это свойство класса, а создадите новое, которое будет в пространстве имён экземпляра, а не класса. В этом легко убедиться используя магический метод __dict__
python как будто javaScript :D ну в принципе оба на си-подобных и написаны :D
А почему этот ваш pupils не выводился? Почему его не видно?
Эммм…
Забил в переводчике - Pupils
Вывело на русском - Ученики школы
Ты гений кнш…
А, если мне надо убрать year или city из class School. То что мне надо сделать? Просто убирая из конструктора эти параметры, то мне выходит ошибка, о том, что я убрал, того не хватает
суть параметра наследования в том - чтобы наследовать все данные от класса 'Building", поэтому в данном случае, тебе нужно перестать принимать параметр 'Building" и делать всё отдельным классом
@@liiizzzzeq спасибо)
10:16 -- У меня ошибку выдает, хотя списываю точь в точь))
Даже я всё понял
По всей видимости поняли что инкапсуляция в ооп излишне. Защита данных от себя самого или своей команды это тупость))) когда это пригождалось если не мешало. Гораздо чаще получается что приватные поля или классы приходится в будущем переделывать особенно если модуль расчитан на доработку)))
есть вопрос, почему в видео сработал ввод
super(school, self).__init__(year, city)
self.pupils = pupils
в моем случае оно не работало пока я сначала не обозначил self.pupils = pupils и только потом super(school, self)...и тд
подскажите пожалуйста
Выжившие сколико вас тут
Вопросы: почему мы, ссылаясь на класс super() в первом случае пишем параметры School и self, а во втором - ничего?
Потому что в первом случае у нас конструктор
Уроки Python с нуля / #19 - Наследование, инкапсуляция, полиморфизм
Школа itProger / Программирование
213 тыс. подписчиков
Подписаться
от мне непонятно
если у меня просто класс, я создаю на его основе обджект, и если я не прописал в def __init__ (year=None, city=None), то я обязан эти значения указать при создании обджекта, иначе у меня вылезет ошибка,
а вот если у меня класс наследуется от класса, и я в наследнике НЕ прописываю в def __init__ super(School, self).__init__(year, city), получается я могу создать школу (напомню что year=None, city=None в def __init__ я НЕ прописывал), у которой не будет года и города, а будут только ученики, и никакой ошибки.
объясните плиз как так и почему? это странно (имхо)
заранее спасибо и прошу прощения если вопрос тупой (я нуб).
Пулеметная очередь информацией аааааааааа
👍🏻
Здравствуйте мне 17 лет и я создал телеграмм канал, где показываю с какими трудностями я сталкиваюсь при изучении языков программирования с нуля. Также объясняю как решать эти проблемы. К каналу есть чат, где я отвечаю на интересующие вас вопросы, если заинтересовало ставь +
Тема наследования не раскрыта. Если указать class House(School) и указать house = House(3, 2000, 'Moscow'), то при запуске выскочит ошибка "TypeError: super() argument 1 must be a type, not School" . Запись super().__init__(year, city) данную ошибку убирает и всё работает.
Прописываю:
class House(School):
pass
house = House(3, 2000, 'Moscow')
house.get_info() - все работает без ошибок(строчка с pass забыта наверное)
Еще заметил факт в классе_наследнике ШКОЛА убрал поле ученики=0 и всё равно всё работает.
2:27 я когда пытаюсь ввести данные в скобки (как на видео, например, 2000 год) у меня выдает ошибку Building() takes no arguments, хотя код списал с видео. в чем прикол?
)
скинь код
@@melancholic_017
class Building:
yearr = None
cityy = None
def __int__(self, yearr, cityy):
self.yearr = yearr
self.cityy = cityy
def get_info(self):
print('Y:', self.yearr, 'C:', self.cityy)
school = Building(и вот в этом месте когда пишу значения выдает ошибку. И pycharm выделяет написанное мол у меня не все хорошо)
@@maiyaglumova def __init__
@@melancholic_017 ой, спасибо большое. Думал, что в компе проблема, а проблема в невнимательности. стыдно даже))
Как же я страдал,что ученики не высвечиваются,что только не делал пока полиморфизм не наступил.
тоже самое
Инкапсуляция не реализована, потому что туфта. Какая разница как получать доступ на прямую или через гетеры и сетары. Согласен, нужно закрыть к тем полям, которые работают внутри класса, типа локальные И тем, которые не должны меняться никогда. Остальным смысл нет. А то как заученную библию трындите не задумываясь.
8:00 peoples*
pupils значит ученики , а peoples значит люди
Какая версия пайтона
Объясните зачем прописывать сколько учеников в школе и как называются здания, зачем это надо
Он показал просто пример как работает наследие
6:00
pupils))
Что не так?)
та шо за пздц TypeError: super(type, obj): obj must be an instance or subtype of type
Говорить про переопределение методов как про полиморфизм в среде без строгой типизации - ну такое...
Прям таки в питоне нельзя указать два класса родителя... учитель учите матчасть
Pupils 😂😂😂😂мне смешно
Чего смешного?)
сложно самый сложный урок в курсе
почему у меня не работает я всё так же сделал
Версия у тебя более новая
Ролику то 2 года
как скрывать
а понял
I 1
Вот я смотрю и думаю что слишком много писанины для вывода всего трех строчек. Неужели нужно столько кода чтобы вывести 3 строки?
Ну эт как бы примеры)
"Всё это будет обрабатываться корректно" - очередная фраза-паразит всех этих видео.
Завязывай троллить. 18 уроково шёл нормально, а потом начал дезой оговариваться.
Боги, почему ты через каждую минуту говоришь "давайте ВОЗМОЖНО сделаем то" или "давайте ВОЗМОЖНО сделаем это"? Ты после этого ЯВНО прописываешь то, о чём только что говорил. Это уже не "возможно", это "определённо"! Андэстенд ми?
кринж
7:47 pupils - количество учеников 😄 сорян, но это слово переводится немного не так, это зрачки, произнёс правильно, а записал нет, people, так нужно было. Без обид, это придирка, по факту можно хоть тра-ля-ля назвать, но нейминг действительно важен и good code лучше с самого начала прививать себе, ибо иногда это может очень плохо аукнуться в больших проектах, имхо...
UPD: извиняюсь, за то, что ложно обвинил автора в некорректности перевода, сорри... Мне указали на мою же ошибку ; (
Друг, забей в переводчик, сам все поймёшь
О_о спасибо, просто изначально в гугле и проверил, там зрачки выдало, а если да, глубже глянуть, действительно, учащиеся, ну либо синоним студенты, хм-м-м, реально спасибо за то, что указали на мою же ошибку 👍🏻
Автору приношу извинения за то, что я сам некорректно перевёл слово...
Ничего страшного. Опять же, главное правильное использование 😅😂
Думаю что "наследники" достаточно бесполезная команда, да и вообще я заметил что в питоне оочень много бесполезных команд
тут просто пример с малым кол-вом параметров, а если их десяток или 2 или 3 десятка ?
В более сложных случаях они нужны.