Обектно-ориентирано програмиране на Python: класове, описание и функции

Класовете на Python са фундаментално понятие. Тя е в основата на стандартната библиотека, работата на най-популярните програми и самия език. Ако искате да станете повече от просто начинаещ програмист, трябва да разберете същността и принципа на работа с класове и обекти.

Какви са класовете

Това е основният програмен компонент на ООП. В класовете на Python се използват за внедряване на нови типове обекти и се създават с помощта на специален клас инструкции. Външно те приличат на стандартни вградени типове данни, като номера или последователности. Но в обектите на класа има значителна разлика - поддържането на наследството.


Обектно-ориентираното програмиране на Python се основава изцяло на йерархичното наследяване на класове. Това е универсален начин за адаптиране и повторно използване на кода. Но обектно-ориентираният подход не е задължителен. Python няма никакъв проблем, позволяващ само процедурно и функционално програмиране. Основната задача на класовете в Python е пакетът данни и изпълним код. Те са синтактично подобни на оператора def. Подобно на функциите, те създават своите пространства от имена, които могат да бъдат многократно извикани от всяка част на програмата. Защо тогава те се нуждаят от тях? Класовете са по-мощен и гъвкав инструмент. По-голямата част от техния потенциал се разкрива по време на създаването на нови обекти.

Значението на класовете и принципа на наследяването

Всеки обект има собствено пространство от имена, което може да бъде програмирано, да въвежда променливи исъздавате функции. Има и атрибути, наследени от клас object.attribute. Това е значението на ООП.


Благодарение на наследяването се създава дървото на йерархията. На практика това е както следва. Когато интерпретатора отговаря на израза object.attribute, той започва да търси първата поява на атрибута в определения клас. Без атрибут интерпретаторът продължава да търси във всички свързани класове, които са в горното дърво, в посока от ляво на дясно. Дървото за търсене включва:
  • суперкласове, които са на върха на йерархията и изпълняват общо поведение;
  • подкласове - са по-долу;
  • копия - елементи от програмата с наследствено поведение.
  • Фигурата показва дървото на класа Python. Примерът показва, че класове 2 и 3 са суперкласове. В долната част има два екземпляра 1 и 2 в средата - подклас Клас 1. Ако напишете израза Instance2.w, той ще принуди интерпретатора да търси стойността на атрибута .w в следния ред:
  • Instance2;
  • Class1;
  • Class2;
  • Клас3.
  • Името на .w ще бъде намерено в суперкласа Class3. В терминологията на ООП това означава, че инстанция 2 "наследява" атрибута .w на Class3. Забележете, че копията в картината наследяват само четири атрибута: .w, .x, .y.z:
  • За примери Instance1.x и Instance2.x атрибутът .x ще бъде намерен в клас 1, където търсенето е спряно, защото клас 1 е на дърво, по-ниско от клас 2.
  • За Instance1.y и Instance2.y атрибутът .y ще бъде намерен в клас 1, където търсенето ще спре, защото това е единственото място, където се появява.
  • За случаите на Instance1.z и Instance2.z преводачът ще намери .z Клас 2защото се намира в лявото дърво от Class3.
  • За Instance2 атрибутът name .name ще бъде намерен в Instance2, без да се търси дърво. Предпоследната точка е най-важната. Той показва как Клас 1 предефинира .x атрибута, заменяйки .x версията на суперкласовия клас 2.

    Обекти, инстанции и методи

    . Класовете създават нови типове, а обектите от клас в Python са копия от тях. Например, всички целочислени променливи принадлежат на тип Int. На езика на ООП те са екземпляри от клас int. Класовете се създават чрез инструкции и обекти чрез обаждане. Те могат да съхраняват данни и да имат свои собствени функции или методи. Терминологията играе важна роля в Python. С негова помощ програмистите разграничават независими функции от тези, които принадлежат към класовете. Променливите, които се отнасят до обекти, се наричат ​​полета. В PLO има два вида полета. Първият е променливите, принадлежащи към целия клас, а вторият е променливите на отделните екземпляри. Полетата и методите заедно са атрибути на клас. В Python, те се записват в блок код след класа на ключовата дума.

    Методи и стойности

    Методите са функции с допълнително собствено име. Той се добавя в началото на списъка с опции. Ако искате променлива може да се нарече различно име, но такава инициатива сред програмистите не е добре дошла. Себе си е стандарт, лесно разпознаваем в кодовото име. Освен това, някои разработени среди са проектирани да работят с него. За да разберем по-добре значението на себе си в ООП, представете си, че имаме клас, наречен ClassA и метод A:
  • клас ClassA;
  • def methodA (self, argument1 argument2).
  • Object objectA е инстанция на ClassA и повикването на метода изглежда така:
  • objectA.methodA (argument1 argument2).
  • Когато интерпретатор вижда тази стъпка, той автоматично преобразува, както следва: ClassA.methodA (objectA, argument1 argument2). Това означава, че инстанция на клас използва само променливата като препратка към себе си.

    Как се създават променливи, методи и екземпляри от класове

    Предлагаме да се демонтира практически пример от интерактивната обвивка на Python. Създаване на експеримента Първият клас започва с класа на инструкциите на компонента:
  • клас Експеримент Първо:
  • def setinf (self, value): # първо създаваме метода с аргументите
  • self.data = value
  • ]
  • def display (self): # втори метод
  • печат (self.data) # данни за печат.
  • След задължителното оттегляне има блок с затворени инструкции def, в който обектите се задават имена на setinf и display. С тяхна помощ се създават атрибутите ExperimentPrivy.setinf и ExperimentPrivy.display. Всъщност всяко име, което присвоява стойност на най-високото ниво в вложения блок, става атрибут. За да видите как работят методите, трябва да създадете два инстанции:
  • x = Experiment First () # Създадени са две копия;
  • y = ExperimentPerfect () # Всеки е отделно пространство от имена.
  • Първоначално образците не съхраняват никаква информация и са напълно празни. Но те са свързани с техния клас:
  • x.setinf ("Teach Python") # Извикайте метод, в който self-x.
  • y.setinf (314) # Еквивалент: Първи експеримент .setinf (y, 314)
  • Ако използвате името на екземпляраx, y се отнасят до атрибута на обекта .setinf на класа клас Експеримент, след което интерпретаторът връща стойността на атрибута на класа като резултат от търсенето в наследяващото дърво.
  • x.display () # В x и y вашите стойности за самостоятелни данни
  • Научи питон
  • y.display ()
  • 314.
  • )

    Претоварване на оператори

    В Python, класовете могат да претоварват оператори на изявления. Тази опция прави копията подобни на вградените типове данни. Процесът е да се прилагат методи със специални имена, които започват и завършват с двойно подчертаване. Помислете в действие __init__ и __sub__. Първият метод се нарича конструктор на клас. В Python __init__ извършва операция за създаване на претоварване. Вторият метод __sub__ изпълнява операцията за изваждане.
  • class load: # създава нов клас
  • def __init __ (self, start):
  • self.data = start
  • def __sub __ (self, other): # копие минус други
  • връщане на претоварване (self.data - друго) # Резултатът ще бъде нов екземпляр
  • A = претоварване

    #__ init __ (A, 10)

  • B = A - 2 #__ sub __ (B, 2)
  • B. Данни #B е нова инстанция на класа на претоварване
  • 8.
  • Повече за метода __init__

    Метод __init__ най-често се използва при работа с класове. Той е необходим за инициализиране на различни обекти. __init__ се обажда отделно. Когато създавате нов екземпляр, методът автоматично получава аргументите, посочени в скоби. С методите на претоварване можете да реализирате всякакви операции с вградени типове данни. Повечето се използват само при решаване на специални задачи, в които е необходимо да се обектисимулира поведението на стандартните обекти. Методите са наследени от суперкласовете и не са задължителни. В началните етапи е лесно да се направи без тях. Но за пълно потапяне в програмирането и същността на ООП, вие се нуждаете от умения за работа с операторите.

    __getitem__ метод

    Методът __getitem__ преодолява достъпа до елемент от индекса. Ако тя е наследена или присъства в дефиницията на клас, тогава за всяка операция индексаторът ще го извика автоматично. Например, когато екземпляр F се появи в израза за извличане на елемент с индекс като F [i], интерпретаторът на Python извиква метода __getitem__, като предава обекта F в първия аргумент на индекса, посочен в квадратни скоби, във втория. Следващият клас "ExampleIndexation" връща квадрата на стойността на индекса:
  • клас ExampleEndexation:
  • def __getitem __ (self, index):
  • индекс на връщане ** 2
  • F = ExampleIndexation ()
  • F
  • # Изразът F [i] нарича F .__ getitem __ (i)
  • 4
  • за i в интервал
    :
  • 76) print (F [i], end = "") # Причини __getitem __ (F, i) във всяка итерация
  • 014 916
  • Използвайки този метод, можете да извършите операция с фрагмент, която често се използва докато работите с поредици. При обработката на списъците стандартният синтаксис на операцията е, както следва:
  • Списък = [13, 6, "и", "c", 74.9]
  • Списък [2: 4]
  • [6, "и", "c", 74.9]
  • Списък [: 1]
  • [13, 6, «и», «c»]
  • Списък [:: 2]
  • [13, «и„, 74.9) ]
  • Клас, прилагащ метода __getitem__:
  • клас Indexer:
  • Моят списък = [13,6] "
  • def __getitem__ (self, index): # Извиква се, когатоИндексиране или извличане на разрез
  • print ("getitem:", index)
  • return self.my_list [index] # Извършва индексиране или извлича разрез
  • X = Индекс 92]
  • X# При индексиране __getitem__ получава цяло число
  • getitem: 0
  • 13
  • X [2: 4] # При извличане на разрез __getitem__ получава обект на разреза
  • getitem: парче (2 4 Няма)
  • ["и", "c"]
  • Обжалване на атрибути

    Специален метод __getattr__ се използва за позоваване на атрибут. Той се нарича с името на атрибута под формата на линия в случай на идентифициране на опит за получаване на препратка към несъществуващ или неопределен атрибут. Когато интерпретаторът може да открие желания обект в дървото на наследството, __getattr __. Методът е удобен за обобщена обработка на заявки към атрибути:
  • клас Отмина:
  • def __getattr __ (self, atname):
  • if atname == "age":
  • друго:
  • повишаване на атрибута Грешка, име
  • D = Gone ()
  • D. възраст
  • 20
  • 112) D. име
  • AttributeError: name
  • Изчезнал клас и неговото копие D нямат атрибути. Следователно, когато се обаждате на D. age, методът __getattr__ се извиква автоматично. Самото копие се предава като самостоятелно, а името на неопределената "възраст" в реда atname. Класът връща резултата от удара на името на възрастта на D., въпреки факта, че той няма този атрибут. Ако класът не очаква атрибута да бъде обработен, методът __getattr__ извиква вграденото изключение и по този начин предава на интерпретатора информация, че името всъщност е несигурно. В този случай опитът за позоваване на името D. води до грешка. Методът работи по подобен начинПретоварване на оператори __setattr__, прихващане на всеки опит за присвояване на стойности на атрибути. Ако този метод е написан в тялото на класа, изразът "self.attitude = value" ще бъде преобразуван в извикването на метода self .__ setattr _ ("атрибут", стойност). Описахме само няколко от съществуващите методи за претоварване. Целият списък е в стандартния езиков справочник и съдържа много повече имена.

    Допълнителни функции

    ООП понякога се използват за сложни и нестандартни задачи. Благодарение на наследяването на класове в Python, поведението на вградените типове данни и техните възможности се разширяват и адаптират. Ако не сте доволни от факта, че индексирането в последователности започва от нулата, можете да го коригирате с помощта на класовата инструкция. За да направите това, трябва да създадете подклас от списъка с типове с нови имена на всички типове и да приложите необходимите промени. Също така, в PLO на езика Python има декоратори на функции, статични методи и много други сложни и специални техники.

    Свързани публикации