Transcript for:
Лекция по Python: Определение классов и объектов, работа с атрибутами

здравствуйте дорогие друзья меня зовут сергей балакирев и на этом занятии мы с вами узнаем как в python и определять классы создавать объекты то есть экземпляры этих классов а также добавлять и удалять их атрибуты то есть данные предположим мы хотим определить класс для хранения координат точек на плоскости для начала я его запишу без какого-либо содержимого для этого мы вначале пишем такой ключевое слово класс и затем через пробел определяем имя этого класса но пусть она называется так вот point но и далее вот здесь вот у нас идет содержимое класс то есть ставим : и у нас начинается блок для класса то есть все что мы определяем здесь внутри нас будет относиться к этому класс point пусть он у нас будет пока пустой я поставлю такой оператор пас все мы с вами определили класс с именем point и смотрите в соответствии со стандартом мэк 8 имя класса принято начинать заглавной буквы и конечно же называть так чтобы она отражала суть этого класса в дальнейшем я буду придерживаться этого правила и так у нас с вами получилась простейшие определение класса но в таком виде он не особо полезен поэтому я пропишу в нем два атрибута 1 атрибут пусть называет скала то есть цвет и принимая такое значение ред а второе требует стекол который будет определять радиус . ну и пусть равен двум обратить внимание переменная внутри класса обычно называют атрибутами класса или его свойствами я буду в дальнейшем использовать эту терминологию теперь в нашем классе есть два вот этих вот атрибута калары стекол но как правильно воспринимать эту конструкцию фактически сам класс образует пространство имен в данном случае с именем point и в этом пространстве имен находится две переменные кола и сёкл и мы можем обращаться к ним использовать синтаксис для пространства имен например так я скопирую этот класс перейду в python console и соответствие создан этот класс вот прям здесь непосредственно в python консоль так будет удобней показывать вот здесь вот справа у нас появился вот этот класс вот он point и соответственно содержит две вот эти от переменной то есть два свойства стекла и color и теперь смотрите мы можем записать имя вот этот класс a point то есть пространство имен point поставить точку и вот здесь вот есть два наших свойство color и сёкл но давайте я выберу color и присвою ему какое-то другое значение например благ черное даже enter и смотрите здесь от справа у нас вот этот свойство color поменялось было red стала black ну или мы можем прочитать какое-либо свойство из этого класса то есть опять прописать его имя поставить точку ну и определить выбрать какую то здесь свойство допустил стекол нажму enter и у нас он вращается значение 2 который как раз содержится в этом свойстве а чтобы увидеть все атрибуты класса то можно воспользоваться такой специальной переменной который называется dict то есть два подчёркивания dict и 2 подчёркивания нажимая enter и у нас появляется такая коллекция напоминающий словарь и здесь у нас много-много разных атрибутов и среди них есть два наших это вот этот color со значением black и сокол со значением 2 теперь давайте сделаем следующий шаг и создадим экземпляры этого класса о нашем случае для создания объекта то есть экземпляр класса достаточно после его имени поставить две вот такие вот круглые скобки нажимаем enter и смотрите справа у нас появился этот перемены а которая является как раз экземпляром этого класса point и через эту переменную доступно два вот таких вот атрибута два свойства color и сёкл которые определены вот в этом классе point или же мы можем создать еще один экземпляр использует точно такой же синтаксис но пример b равняется point и две круглые скобки нажимаем enter и у нас вторая переменная b который имеет совершенно другой адрес вот здесь мы это видео значит вот адрес переменной b и адрес перемены а они отличаются это означает что объекта а и объект б это совершенно два раза независимых объекта и в объекте b также присутствует два вот этих свойства стекла и color по аналогии может создавать произвольные количество экземпляров класса так как переменные а и б у нас ссылается на объекты класса point то мы это явно можем определить с помощью такой функции type я за записать type и ad а то на выходе увидим что это есть ни что иное как объект класс point то есть он принадлежит как бы типу вот это вот класса point и мы можем это даже явно вот так проверить если запишем type от а-два равно и point на выходе получим тару или вот в таком вот виде из instance а , point в этом случае мы тоже на выходе получим true то есть имя классы здесь выступает в качестве типа данных но давайте детальней разберемся что же у нас здесь с вами и в действительность получилось во первых объекты а и b образует свое пространство имен пространство имен экземпляров класса и во-вторых не содержит никаких собственных атрибутов свойства color и сёкл берутся непосредственно из класса point внутри вот этих вот объектов а и б этих свойств нету не существует они ссылаются на соответствующие свойства атрибуты вот это вот класса point поэтому я не случайно называю эти две переменные атрибутами класса подчеркивает тот факт что эти перемены находятся внутри класса point то есть атрибуты класса они общие для всех его экземпляров и мы можем в этом легко убедиться например давайте изменим вот такое свойство стекол у нас она сейчас принимать значение 2 а мы поставим значение 1 я нажимаю enter и смотрите вот здесь в то автоматически в наших объектах это значение тоже поменялась двойки на единицу мало того и ли посмотреть но вот этот коллекцию dict от у этого объекта а например то она будет пустой это как раз и говорит о том что сам по себе объекта а сейчас не содержит никаких атрибутов и то же самое с объектом б он тоже будет пустой то есть этот коллекция dict будет пустая то есть наши объекты а и b образуют пространства имен но в этом пространстве имен пока ничего нету но тем не менее мы через них можем обращаться к атрибутам класса point то есть с написать а . например color то увидим вот это значение black то есть это значение благ была взята непосредственно из класса point или можем записать так бей . сёкл соответственно получим значение 1 но если мы выполним вот такую команду а . color и присвоим какой то другой цвет ну например green то смотрите что у нас получится я нажимаю enter и справа вот здесь вот объект а свойства color принимает горин а объект б свойства color осталось благ почему так произошло дело в том что когда мы выполняем вот это вот команду то через а обращаемся вот к этому пространству имен к пространству имен объекта а и далее вот этот оператор присваивания он создает переменную с именем color в текущем пространстве имен несмотря на то что мы как бы можем брать вот эту переменную из другого пространства имен из внешнего пространства из класса point но вот этот оператор присваивания работает вот именно так если переменной color отсутствует вот а в этом текущем пространстве имен то это переменная то есть в данном случае атрибут создается в этом текущем пространстве имен и в итоге объект а уже содержит свой собственный атрибут то и свойства вот с этим именем color ну а объект б по-прежнему ссылается на color вот этого класса point и мы в этом также можем убедиться если распечатаем коллекцию вот для этого объекта а то есть напишем а.а. dict и смотрите здесь у нас появился вот это вот локальные свойства с именем color и значением green вот этот момент нужно себе очень хорошо знать и понимать на этом принципе в python построена формирование атрибутов классов и локальных атрибутов их экземпляров кстати по аналогии мы можем создавать новые атрибуты и в классе point для этого достаточно записать имя класса поставить точку но и придумать какой-нибудь новый свойство нам product type pt и присвоить какой-нибудь значение у пусть от будет значение диск нажимаем enter и смотрите у нас вот здесь этого объектах появилось вот это новые свойства type t со значением диск и если мы посмотрим на класс point to в этом классе point тоже появилось вот это вот новые свойства то есть вот так вот мы можем добавляет динамически новые свойства вот в этот класс то есть новая атрибута или то же самое мы можем сделать с помощью такой специальной функции которая зывается сета а татар в качестве первого аргумента мы указываем то пространство имен с которым хотим работать пусть это будет класс point и далее через битую вторым аргументом в виде строки обратить внимание виде строки мы должны прописать то свойство кто-то атрибут которому хотим присвоить то или иное значение вот я здесь прописал совершенно новый атрибут проб которого нет пока еще в классе point и пусть он принимает это требует значение 1 то есть вот три таких аргумента нажимая enter и смотрите у нас в классе point появился вот этот атрибут свойство проб со значением 1 то есть если в классе не существует атрибута которого мы хотим присвоить какое-либо значение то она динамически в него добавляется а если мы пропишем здесь какой-нибудь уже существующей атрибут евро так type t и присвоим новые значения на пресс квар то просто поменяем значение диск который здесь есть на новые значения square то есть вот так вот можно работать с атрибутами классов динамически добавлять их и менять значение если же мы хотим прочитать какое-либо значение атрибута из класса то для этого достаточно прописать опять же имя класса или имя экземпляра класса без разницы ну и соответственно указать тот атрибут которым мы хотим обратиться например стекол на выходе получи вот этого значения 1 но или можем присвоить какой-либо переменной результат этого атрибута и соответствует переменная будет содержать значение этого атрибута но при обращении к несуществующему атрибут класса например а его не существует мы получим ошибку вот этой ошибки можно избежать если воспользоваться специальной функции которая зывается get to the top она позволяет брать читать атрибута из указанного пространство имен в данном случае я указываю класс но можно указать и объекты класса это без разницы я укажу класс и дали через запятую укажу несуществующей атрибут а если мы вот так вот запишем то опять получим ошибку но и здесь можно прописать третий аргумент я его пропишу так фолз и этот третий аргумент будет возвращаться если указанный атрибут не обнаруживается ну а если мы здесь укажем существующие свойства например color то она соответствует возвращается причем можно списать вот в таком вот виде эту функцию goto top а можешь вот это вот третий аргумент не писать будет в данном случае зеленый тоже результат но если вот это вот атрибут color не будет в классе point to с отвесом а получим ошибку наконец мы можем не только добавлять но и удалять любые атрибуты из класса и сделать это можно по крайне мере двумя способами первое это воспользуюсь статьи о то оператором dl но и соответственно указать какой атрибут из какого пространство имен удаляется данном случае мы хотим из класса point удалить вот такой допустим атрибут проб нажимая enter и смотрите в нашем классе point теперь этого атрибута проб нету мы его удалили но и сама попытаемся повторить эту команду то у нас уже будет ошибка потому что удалять несуществующей атрибут спорта кайт команда del нельзя поэтому прежде чем делать ударение того или иного атрибута по идее было бы хорошо проверить а существует он или не существует для этого можно вызвать вот такую специальную функцию называется так вот завтра ну и соответственно здесь указываем пространство имен то есть в данном случае класс укажу ну и то свойство который мы собираемся удалить проб на выходе она даст фолз потому что такого свойства такого атрибута в классе нету если бы она была мы здесь увидите либо значение true но давайте я пропишу и здесь и стекол нажимаю enter и у нас появляется значение true потому что такое свойство в классе point существует так вот первый способ удаления атрибута это оператора д л а второй способ это использование функции которая называется дел а татар мы здесь указываем первым аргументом пространство имен из которого удаляется атрибут ну а дали этот атрибут который мы собираемся удалить ну например вот такой вот type pt нажимаю enter и смотрите у нас из классы действительно был удален этот атрибут т.п. разумеется если мы ещё раз вызовем эту же функцию для того же самого атрибута то получим ошибку то есть удалять может только те атрибуты который присутствует в классе поэтому прежде чем что-либо удалять нужно проверить а существует такой атрибут в классе или не существует и то же самое с объектами существует такой атрибут в объекте или не существует причем смотрите если мы сейчас вот вызывают это вот функцию swizer для класса point и укажем атрибут который существует ну допустим color то конечно же получим значение true а если мы укажем здесь имя объекта например а то тоже видим true да я забыл что мы вот этот свойства color создали непосредственно вот в этом экземпляре поэтому конечно же видим здесь труп давайте вместо color пропишите стекол нажимаем enter это же видим троп то есть вот этот функциях и зато она говорит о том что мы можем в принципе получить через пространство имен а доступ от к этому атрибуту сёкл но она не говорит о том что данный атрибут находится непосредственно от в этом пространстве имен а вот на это обращайте внимание то есть если мы вот здесь вот мы видим коллекцию диктата смотрите в ней существует только один атрибут а вот это вот 2 атрибуты сокола здесь нету тем не менее функция газа от r возвращает значение true того что мы в принципе через а можно обратиться вот к этому атрибуту стекол то есть функциях is at our работа и вот именно таким образом а вот удаление атрибутов происходит непосредственно в текущем пространстве мед фраера если написать д л а и здесь укажем стекол то есть вот это вот атрибут стекол он отсутствует в секущей пространство имен то мы получим ошибку а вот удалить color мы вполне можем потому что он в этом объекте присутствует прыща выполнить эту строчку обратите внимание в нашем объекте а вот это свойство color принимает значение garena сейчас мы удалим это свойство из объекта а я нажимаю enter и у нас получает следующие в этом объекте а это свойство color остается но принимает уже значение black я думаю вы догадались почему это произошло в то уж после удаления атрибута color из объекта а этот color стал братца непосредственно из класса point то есть поиск того или иного атрибута выполняется следующим образом сначала он ищется в текущем пространстве мед а если не находится здесь то берется из следующего внешнего на который соответствует ссылается вот это вот внутреннее пространство в данном случае внешние для любого объекта это класс от которого он был образован но в данном случае от класс point поэтому вот этот атрибут color для объекта а берется уже и из класса point вот этот момент также следует хорошо понимать при работе с локальными свойствами объектов и атрибутами класса и так теперь когда мы с вами выяснили как создаются атрибуты вернемся к нашей задачи формирования объектов точек на плоскости я снова определю вот этот класс point заново и также заново создам два объекта объект а и объект б у этих двух объектов мы автоматически получаем два вот этих вот общих свойства стекол и color но координаты точек у этих объектов должны исключительно принадлежать вот этим вот экземпляром поэтому эти координаты мы пропишем следующим образом укажем пространства имен а то есть объекта а поставим точку я запишу первую координату как x и присвоить значение 1 соответственно вы здесь о так в объекте а у нас появилось новое локальные свойства с именем x и значением 1 ну и то же самое для второй координата y я пропишу просто значение 2 в результате объект а содержит два собственных локальных свойства x и y со значениями 1 и 2 и то есть координата точки ну и то же самое мы можем прописать для объекта b пусть здесь будет координаты 10 и 20 то есть вот эти вот свойство x y который мы определили вот таким вот образом то есть динамически создали их для соответствующих экземпляров класса они являются независимыми между собой в результате у нас каждый объект представляет точку с независимыми координатами на плоскости но а цвета их размер является как общими данными для всех этих объектов то есть вот эти вот образом мы можем создавать локальное индивидуальное свойство для каждого объекта ну и в заключении этого занятия отмечу что в любому классе языка python мы можем определять его описание виде вот такой вот начальной строке если мы сейчас вот в консоли определим именно вот такой вот класс вот с этой 1 строку это смотрите у этого класса есть вот такая вот перемена она называется dogs 2 подчёркивания долго 2 подчеркивать и вот это переменной док как раз содержит вот ту строку то описание который мы здесь вот в начале прописываем обычно так делает при создании больших программ когда в ключевых классах прописывать создают такие описания чтобы в последующем было удобнее возвращаться к ним корректировать и использовать не обращаясь к специальную документацию и так из этого занятия должны себе хорошо представлять как определяется классов python и как создаются объекты класса что и себя представляет атрибут класса и атрибут объектов уметь обращаться к этим атрибутом используя атаки от функция добавление чтения проверьте на наличие ну и удаление атрибутов а также знать за что отвечает вот эти вот две перемены если все это вам понятно то смело переходить к следующему занятию [музыка]