У овом водичу ћемо научити о редоследу решавања метода, који је такође познат као МРО. То је суштински концепт наслеђивања Пајтона.
Редослед резолуције метода описује путању претраге класе која Питхон користи да добије одговарајући метод у класама које садрже вишеструко наслеђивање.
Увод
Као што знамо, класа која се наслеђује назива се подкласа или родитељска класа, док је класа која наслеђује позната као подређена класа или поткласа. У мулти-наслеђивању, класа се може састојати од много функција, тако да се техника редоследа резолуције метода користи за претрагу редоследа којим се основна класа извршава.
Једноставним речима - 'Метод или атрибути се истражују у тренутној класи, ако метод није присутан у тренутној класи, претрага се помера на родитељске класе и тако даље'. Ово је пример претраге у дубину.
Он игра суштинску улогу у вишеструком наслеђивању где се исти метод може наћи у више суперкласа.
Да бисмо га боље разумели, хајде да видимо како га можемо користити.
Пример -
линукс оперативни систем
class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname())
Излаз:
I am a class C
Објашњење -
У горњем коду постоји вишеструко наслеђе. Дефинисали смо три класе које се зову А, Б и Ц, а ове класе имају исти назив који се зове метод моје име(). Направили смо објекат класе Ц. Објекат је позвао класу Ц, а не класу, док је класа Ц наследила метод класе А.
кор у јава
Редослед се прати у горњем коду је класа Б -> класа А. Ова техника је позната као МРО (редослед решавања метода).
Хајде да разумемо још један пример вишеструког наслеђивања.
Пример -
class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname()
Излаз:
I am a class B
Објашњење -
У горњем коду, направили смо још једну Д класу без дефинисања атрибута класе који су наследили Б и Ц класу. Када смо позвали метод моје име(), иде у класу Д и тражи моје име( ) функција. Али класа Д нема никакву декларацију. Дакле, претрага се преноси у класу Б, добија моје име() функцију и враћа резултат. Претрага ће се одвијати на следећи начин.
Class D -> Class B -> Class C -> Class A
Ако класа Б не би имала метод, позваће метод класе Ц.
Овде предлажемо да уклоните метод класе Б и проверите шта се дешава. Радећи ово, добићете идеју о томе како функционише резолуција метода.
Стари и нови стилски поредак
У старијој верзији Питхона (2.1), ограничени смо на коришћење старих класа, али Питхон (2.2 & настави), можемо користити нове класе. Подразумевано, Питхон 3 има оригиналне (нове) класе. Први родитељ нове класе стила наслеђује од Питхон роот 'објецт' класе. Погледајмо следећи пример -
Пример -
# Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass
Стил декларације обе класе је другачији. У резолуцији метода, класе старог стила прате алгоритам прве дубине лево-десно (ДЛР), док нове стилске класе користе алгоритам Ц3 линеаризације док обављају вишеструко наслеђивање.
ДЛР алгоритам
Питхон креира листу класа док имплементира вишеструко наслеђивање између класа. Та листа се користи да би се одредило који метод треба позвати инстанце позивају.
Можемо претпоставити да ће рад по његовом имену јер ће резолуција метода тражити прво по дубини, а затим ићи с лева на десно. Испод је пример.
Пример -
class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass
Прво, алгоритам ће тражити у класи инстанце призвану методу. Ако се не нађе, иде у прародитеље, ако се такође не нађе. Погледаће родитељ родитеља. Ово ће се наставити до краја наследних часова.
бројеви за азбуку
У горњем примеру, редослед решавања метода ће бити -
class D -> class B -> class A -> class C -> class A
Али, А не може бити два пута присутно па -
class D -> class B -> class A -> class C ->
Овај алгоритам показује чудно понашање у то време. Погледајмо пример у наставку.
Пример -
class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass
Према ДЛР алгоритму, редослед ће бити Е, Ц, Д, Б, А. Постоји размена класа А и Б у класи Ц, што је веома двосмислено. То значи да алгоритам не чува својство монотоности.
Самуеле Пердони је био прва особа која је открила недоследност између алгоритама МРО.
јава матх
Ц3 линеаризациони алгоритам
Ц3 линеаризациони алгоритам је боља верзија ДЛР алгоритма јер уклања недоследност. Овај алгоритам има нека ограничења која су дата у наставку.
- Деца морају бити испред својих родитеља.
- Ако одређена класа наслеђује једну или више класа, оне се чувају редоследом наведеним у торци основне класе.
Правила Ц3 линеаризационог алгоритма
- Структуру редоследа решавања метода дефинише граф наслеђивања.
- Корисник мора да посети супер класу тек након посете методама локалних класа.
- Сачувајте монотоност
Метод за класу Метод Резолуција
Питхон пружа два начина да добијете редослед резолуције метода класе - __мро__ атрибут или мро() методом. Уз помоћ ових метода можемо приказати редослед метода којим се решавају.
Хајде да разумемо следећи пример.
Пример -
class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro())
Излаз:
(, , , , ) [, , ]
Као што видимо у горњем излазу, добијамо редослед редоследа резолуције метода. На тај начин, Ц3 линеаризациони алгоритам ради за вишеструко наслеђивање.