Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Python (MRO)

БСгодня ΠΌΡ‹ собираСмся ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Python ΠΈΠ»ΠΈ MRO для краткости. Если Π²Ρ‹ слСдуСтС Π·Π° руководствами ΠΏΠΎ классам Python ΠΈ наслСдования, ΠΈ Π²Ρ‹ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠ²Π°Π»ΠΈΡΡŒ Π² ΠΊΠΎΠ΄Π΅, Π²Ρ‹ ΠΏΠΎΠΉΠΌΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ иСрархия классов пСрСмСщаСтся Π² нСсколько наслСдований, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ странныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ с нСпонятными ошибками. … ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ … ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ … Python Method порядок (MRO) ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Β»

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ эти ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° классы Python ΠΈ наслСдство. НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° этим Π²ΠΈΠ΄Π΅ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ снимаСтС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Python (MRO)?

Когда ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² классС с нСсколькими наслСдованиями, Python слСдуСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ порядку ΠΏΡ€ΠΈ поискС элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ. Π­Ρ‚ΠΎΡ‚ Π·Π°ΠΊΠ°Π· называСтся порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΈ ΠΎΠ½ соотвСтствуСт Π΄Π²ΡƒΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ:

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ эти ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ для изучСния. __Bases__ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, __mro__ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π° Python встроСнный супСр класс Β«ΠžΠ±ΡŠΠ΅ΠΊΡ‚Β».

Одна Π±ΡƒΠ΄ΡŒΡ‚Π΅ здСсь, Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° MRO Π² зависимости ΠΎΡ‚ вСрсии Python, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. Π₯отя Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ вряд Π»ΠΈ ΠΏΠΎΡ€Π°Π΄ΡƒΠ΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· нас Π² повсСднСвном использовании, я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚Π΅ Python сСгодня, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π²Π΅Ρ€ΡΠΈΡŽ 3.x, ΠΈ ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ я ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ с Π½ΠΎΠ²Ρ‹ΠΌ стилСм классов Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __bases__?

__Bases__ Атрибут – это встроСнный класс Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выводят Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы любого Класс Π’Ρ‹ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ это.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Π΅ΠΌ __Bases__ Атрибут Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… наслСдований, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄. Π’ΠΎΡ‚ Π±Π»ΠΎΠΊ-схСма Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ. Π”Π²Π° класса Π΄Π΅Π΄ΡƒΡˆΠ΅ΠΊ, ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π² дСтский класс.

И ΠΊΠΎΠ΄ здСсь. БкладскиС ΠΈ складскиС классы – Π΄Π΅Π΄ΡƒΡˆΠΊΠ°, класс ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ являСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ, Π° ΠΏΠ»ΠΎΠ΄Ρ‹ – это Ρ€Π΅Π±Π΅Π½ΠΎΠΊ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ __Bases__ Π—Π²ΠΎΠ½ΠΈΡ‚Π΅ Π½Π° Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ²Ρ‹Π΅ ΡˆΠΎΡƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹ ΠΊΠ°ΠΊ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠžΡ‚ΠΊΠ°Π· ΠŸΡ€ΠΈΠ·Ρ‹Π² __Bases__ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Класс Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сток ΠΈ Π‘ΠΊΠ»Π°Π΄ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠžΡ‚ΠΊΠ°Π· Как ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² Π΄Π²ΡƒΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… Ρ€Π°Π½Π΅Π΅, сток ΠΈ Π‘ΠΊΠ»Π°Π΄ Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, порядок поиска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Python ΠΏΡ€ΠΈ поискС Π΄Π΅Ρ€Π΅Π²Π°.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __mro__

Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π² Python, ΠΊΠΎΠ³Π΄Π° вызываСтся, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ Из классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Python ΠΏΡ€ΠΈ поискС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Π²ΠΎ врСмя Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Π·ΠΎΠ²Π΅ΠΌ __mro__ Π½Π° сток Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали Π² послСднСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ – это сток Класс, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ это Π½Ρ‹Π½Π΅ΡˆΠ½ΠΈΠΉ класс. Но Ρ‡Ρ‚ΠΎ упоминаСтся класс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°? сток Класс – это Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ своих Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Python Base Object Object Class

ИспользованиС __mro__, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Если ΠΌΡ‹ вСрнСмся Π² наш ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΠΌ __mro__ Атрибут Π½Π° Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌ классС, Π€Ρ€ΡƒΠΊΡ‚Ρ‹ ΠΈ посмотритС, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ.

Π‘ΠΎΠ»Π΅Π΅ слоТныС структуры

Наши ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π±Ρ‹Π»ΠΈ элСмСнтарными ΠΈ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΌΠΈ, Π½ΠΎ Ρ‡Ρ‚ΠΎ, Ссли Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТная структура? Π’ΠΎΡ‚ Π±Π»ΠΎΠΊ-схСма, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Python Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° кулисами.

Π’ΠΎΠ³Π΄Π° Π²ΠΎΡ‚ ΠΊΠΎΠ΄, прСдставлСнный этой Π±Π»ΠΎΠΊ-схСмой.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ это интСрСсно. Π—Π°ΠΊΠ°Π· слСдовал Π½Π΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±ΠΎΠ»Π΅Π΅ эффСктивно ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ€ΡƒΠΊΡƒ Π°Π»ΠΌΠ°Π·Π°, ΠΈΠ· консСрвированного, Π½Π° склад, Π·Π°Ρ‚Π΅ΠΌ Π½Π° складС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ поиску ΠΏΡ€Π°Π²ΠΎΠΉ стороны Ρ‡Π΅Ρ€Π΅Π· поставщик снова Π½Π° складС?

Однако Python Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π΄Π²ΡƒΡΠΌΡ‹ΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ Ссли Π±Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ описано, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΊΠ°Π·:

Π­Ρ‚ΠΎ просто Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с наслСдством вопросов ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ вас Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ класс Π΄Π΅Π΄ΡƒΡˆΠΊΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сток ΠΏΠ΅Ρ€Π΅Π΄ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классом, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ поставщик. Или ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ супСр класса, Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ Π±Π°Π±ΡƒΡˆΠΊΠ° ΠΈ родитСля. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° опрСдСляСтся ΠΊΠ°ΠΊ:

Π­Ρ‚ΠΎΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ соотвСтствуСт Ρ‚Π΅ Π΄Π²ΡƒΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π²Π²Π΅Π»ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ MRO ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅?

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ваш ΠΊΠΎΠ΄ Π½Π°Ρ‡Π½Π΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ слоТным, с нСсколькими уровнями наслСдования, Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½Ρ‹Ρ… структур ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… классов, Тизнь Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΈΠΌ. Если классы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ нСприятный ΡΡŽΡ€ΠΏΡ€ΠΈΠ· ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ значСния. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сообщСниС ΠΎΠ± ошибкС, ΠΊΠΎΠ³Π΄Π° Python Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΄Π²ΡƒΡΠΌΡ‹ΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ? Π’ΠΎΡ‚ Π±Π»ΠΎΠΊ-схСма.

ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ высокий класс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΌ классом, Π½ΠΎ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ просим, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создали класс ΠΏΠΎΠ»ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»ΠΊΠ° (Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€, shop_dispatch) ΠžΡ‚ΠΊΠ°Π· Π•ΡΡ‚ΡŒ Π΄Π²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Одним ΠΈΠ· Π½ΠΈΡ… – это ΠΏΠ΅Ρ€Π΅ΠΎΠ΄Π΅Ρ‚ΡŒΡΡ Π² скобныС классы для чтСния Полка (Shop_Dispatch, Π”ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€) Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ здСсь. Но Π²Ρ‹ исправляСтС Π·Π° Π»ΠΎΠ²ΡƒΡˆΠΊΡƒ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ с дальнСйшими измСнСниями ΠΊΠΎΠ΄Π°, оставив вас с грязным ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ класс Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€Π° Π² качСствС родитСля ΠΏΠΎΠ»ΠΊΠ° ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступны Ρ‡Π΅Ρ€Π΅Π· ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ. Π‘ΠΌ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ сняли ссылку Π½Π° класс Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€Π° ΠΈΠ· ΠΏΠΎΠ»ΠΊΠ° класс. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΌΡ‹ Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² классС Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€Π°, созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»ΠΊΠ° Класс, Π·Π°Ρ‚Π΅ΠΌ называСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΊΠΈ с использованиСм Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’ΠΎΠ³Π΄Π°, Ссли ΠΌΡ‹ ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΠΌ __mro__ ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠΏΠΎΠ»ΠΊΠ° Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ.

Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ, Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΈ понятный ΠΊΠΎΠ΄ с Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ порядком Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

РСзюмС

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

MRO – порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Python

ΠŸΠΎΠ³ΠΎΡ€ΠΈΠΌ ΠΎ наслСдовании. Если ΠΎΠ΄ΠΈΠ½ класс унаслСдован ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΎΠ½ ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π½ΠΈΠΌΠ°Π΅Ρ‚ сСбС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ своСго родитСля. Π’Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свою Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ – Π² этом ΠΈ Π΅ΡΡ‚ΡŒ смысл наслСдования. Но Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π½Π΅ пСрСопрСдСляли, Ρ‚Π°ΠΊ ΠΈ останутся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ экзСмпляра класса, Python Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² Π½Π΅ΠΌ этот ΠΌΠ΅Ρ‚ΠΎΠ΄. Если Π΅ΡΡ‚ΡŒ – ΠΎΠ½ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½, Π° Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚, Ρ‚ΠΎ Π΅ΠΌΡƒ придСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ классы-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса. Π’Π΄Ρ€ΡƒΠ³, Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ?

Π’ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π±Π΅Π½ΠΎΠΊ ΠΈΠ³Ρ€Π°Π΅Ρ‚, ΠΈΠ³Ρ€Π°Ρ‚ΡŒ – это Π΅ΠΌΡƒ присущий ΠΌΠ΅Ρ‚ΠΎΠ΄. Но Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ дСньги ΠΎΠ½ ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚, Π½ΠΎ Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ с этим ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ earn_money Π±ΡƒΠ΄Π΅Ρ‚ взят ΠΎΡ‚ родитСля. Π”ΡƒΠΌΠ°ΡŽ, Ρ‚ΡƒΡ‚ всС ясно.

Π‘Π»ΠΎΠΆΠ½Π΅Π΅ ситуация становится, ΠΊΠΎΠ³Π΄Π° иСрархия классов разрастаСтся. НС Π±ΡƒΠ΄Π΅ΠΌ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мноТСствСнноС наслСдованиС, Ρ‡Ρ‚ΠΎ сдСлаСт Π³Ρ€Π°Ρ„ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ классами вСсьма Π·Π°ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π»ΡŽΠ±Ρ‹Ρ… классах ΠΈΠ· всСй ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ. И Ссли ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос Β«Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ?Β» довольно прост: сначала посмотри Π² самом классС, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π² Π΅Π³ΠΎ родитСлях; Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос Β«Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС ΠΈΡΠΊΠ°Ρ‚ΡŒ?Β» Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ. НапримСр, взглянитС Π½Π° Ρ‚Π°ΠΊΡƒΡŽ иСрархия классов:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro pythonΒ«ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉΒ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π‘ΠΌΠΎΠΆΠ΅Ρ‚ сходу Π½Π°Π·Π²Π°Ρ‚ΡŒ порядок поиска ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² этой ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ? Π― Π²ΠΎΡ‚ ошибся с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ, ΠΈ Π΄Π°ΠΆΠ΅ со Π²Ρ‚ΠΎΡ€ΠΎΠΉ. Π£Π·Π½Π°Π΅ΠΌ ΠΏΡ€Π°Π²Π΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ mro():

Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠ΅ этот MRO?

АббрСвиатура MRO – method resolution order. А ΠΏΠΎ-русски это пСрСводится ΠΊΠ°ΠΊ «порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Β». Но! Π’ΠΎΠΆΠ΅ самоС относится Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, Π½ΠΎ ΠΈ ΠΊ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ класса, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ – это частный случай Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ понятия Β«Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Β».

ΠœΠ΅Ρ‚ΠΎΠ΄ класса Z.mro() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°ΠΌ список классов Ρ€ΠΎΠ²Π½ΠΎ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Python Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ Π½Π΅ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro pythonΠ ΠΎΠΌΠ±ΠΎΠ²ΠΈΠ΄Π½ΠΎΠ΅ наслСдованиС

Π’ Π±ΠΎΠ»Π΅Π΅ слоТных иСрархиях потрСбуСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Алгоритм C3-Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

КакиС ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²?

Алгоритм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удовлСтворяСт этим условиям Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π² 1996 Π³ΠΎΠ΄Π° ΠΈ называСтся C3 superclass linearization. ЛинСаризация Π² Π΄Π°Π½Π½ΠΎΠΌ случаС – это процСсс прСвращСния Π³Ρ€Π°Ρ„Π° наслСдования Π² плоский список. А Π‘3 ΠΎΠ½ называСтся ΠΈΠ·-Π·Π° наличия Ρ‚Ρ€Π΅Ρ… основных свойств. Π’Π°ΠΆΠ½Π΅ΠΉΡˆΠ΅Π΅ свойство здСсь – это ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ – это свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ соблюдСния Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ порядка слСдования классов-ΠΏΡ€Π°Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΈ Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса-родитСля.

Π’ Python Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ появился Π΅Ρ‰Π΅ Π² Π΄Π°Π»Π΅ΠΊΠΎΠΉ вСрсии 2.3.

Если Π²Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚Π΅ Π½Π°Π²Ρ‹ΠΊΠ°ΠΌΠΈ чтСния английской тСхничСской Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΠΎΠΌ ΡΡ‚Π°Ρ‚ΡŒΠΈ, PDF я нашСл Π½Π° просторах ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°. Π•ΡΡ‚ΡŒ ΠΈ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° русском языкС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π° Π₯Π°Π±Ρ€Π΅. Π’Π°ΠΌ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ составлСния Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΉ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ?

ВСрнСмся ΠΊ исходному ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ mro python

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ порядок. C Π½Π°Ρ‡Π°Π»Π°, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π² MRO-список ΠΎΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ класс Z. ΠŸΠΎΡ‚ΠΎΠΌ класс K1, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС наслСдования Z. Π”Π°Π»Π΅Π΅, Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ класс A. Π­Ρ‚ΠΎΡ‚ класс большС Π½ΠΈΠΊΠΎΠΌΡƒ Π½Π΅ являСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ K1, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ добавляСт A сразу послС K1, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠΈΠ² Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ». ПослС A нСпосрСдствСнно Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ΄Ρ‚ΠΈ класс B, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π° Π½ΠΈΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Ρ‰Π΅ Π²ΠΎΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ K2, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ K2 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ·ΠΆΠ΅ B, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ. НСт! Π‘Ρ‚Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ³Π΄Π° сначала K2, ΠΏΠΎΡ‚ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ B. Π”Π°Π»Π΅Π΅, ΠΏΠΎ схоТСй ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ K3, Π΄Π°Π±Ρ‹ ΠΎΠ½ Π½Π΅ оказался послС своСго родитСля C. ДополняСм список классами D ΠΈ E Π² ΠΈΡ… порядкС. И остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ список классами O, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ для всСх ΠΏΡ€ΠΎΡ‡ΠΈΡ… классов, ΠΈ object, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ для O. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ стоит ΠΏΠ΅Ρ€Π΅Π΄ стоим ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ (Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‡ΡƒΠΆΠΈΠΌ). А Ρ‚Π°ΠΊΠΆΠ΅ порядок слСдования классов Π² MRO согласован с порядком наслСдования.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я размСстил здСсь (ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ прямо Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Автор Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ – Π½Π΅ я. НашСл Π½Π° Github.

Когда нСльзя Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ?

Π”ΡƒΠΌΠ°ΡŽ, Ρ‚Π°ΠΊΠΎΠΉ вопрос ΠΈΠΌΠ΅Π΅Ρ‚ мСсто Π±Ρ‹Ρ‚ΡŒ Π½Π° собСсСдовании. Вас ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ привСсти ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов, Π½Π΅ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π»ΠΈΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ стандартному Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ. Π’ΠΎΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΡ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Или Π²ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Как Π·Π°Π΄Π°Ρ‚ΡŒ свой порядок MRO?

Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ мСтаклассы. Для Β«ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΠΎΠ³ΠΎΒ» класса ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ особый мСтакласс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСопрСдСляСт явно ΠΌΠ΅Ρ‚ΠΎΠ΄ mro(), указывая Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². На ΠΏΠ΅Ρ€Π²ΠΎΠΌ Β«Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΠΎΠΌΒ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ΅:

Π’Ρ‹ super()!

Иногда трСбуСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу ΠΈΠ· Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ. НапримСр, Ссли Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс пСрСопрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ Π΅ΠΌΡƒ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса. Π”Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ класса Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΡƒΡ‡Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ Π±Π°Π³ΠΎΠ², особСнно, Ссли наслСдованиС мноТСствСнноС, ΠΈ ΠΌΡ‹ ΠΌΠ°Π»ΠΎ Ρ‡Ρ‚ΠΎ Π·Π½Π°Π΅ΠΌ ΠΎΠ± устройствС ΠΈ родствСнных связях наслСдуСмых классов. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ссли со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ иСрархия ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ состоянии. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° MRO классу-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ Ρ‡Π΅Ρ€Π΅Π· super().

super() – это особСнный прокси-класс ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу:

Π’ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классах Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ super(), поэтому всС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΡΡ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² порядкС MRO.

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для ΠΊΠ°Π½Π°Π»Π° @pyway. ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° ΠΌΠΎΠΉ ΠΊΠ°Π½Π°Π» Π² Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ @pyway 👈

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (MRO) Π² Python Π² мноТСствСнном наслСдовании

Π’ этом руководствС ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ ΠΎ порядкС Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ извСстСн ΠΊΠ°ΠΊ MRO. Π­Ρ‚ΠΎ ваТная концСпция наслСдования Python.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (MRO) Π² Python описываСт ΠΏΡƒΡ‚ΡŒ поиска класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² классах, содСрТащих мноТСствСнноС наслСдованиС.

ВступлСниС

Как ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, наслСдуСмый класс называСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классом ΠΈΠ»ΠΈ подклассом, Π° Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс называСтся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ классом ΠΈΠ»ΠΈ подклассом. ΠŸΡ€ΠΈ мноТСствСнном наслСдовании класс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, поэтому ΠΌΠ΅Ρ‚ΠΎΠ΄ порядка Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для поиска порядка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс.

ΠŸΡ€ΠΎΡ‰Π΅ говоря, ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΡΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ классС, Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ отсутствуСт, поиск ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классам ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ поиска Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ.

Он ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² мноТСствСнном наслСдовании, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… супСрклассах.

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ это, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ присутствуСт мноТСствСнноС наслСдованиС. ΠœΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈ класса с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ A, B ΠΈ C, ΠΈ эти классы ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ myname(). ΠœΡ‹ создали ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса C. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Π·Π²Π°Π» класс C, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ класс C унаслСдовал ΠΌΠ΅Ρ‚ΠΎΠ΄ класса A.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся с Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ мноТСствСнного наслСдования.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ создали Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ класс D Π±Π΅Π· опрСдСлСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² класса, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π²ΡˆΠΈΡ… классы B ΠΈ C. Когда ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ myname(), ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ классу D ΠΈ ΠΈΡ‰Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ myname(). Но Ρƒ класса D Π½Π΅Ρ‚ объявлСния. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, поиск ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ классу B, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ myname() ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Поиск Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Если Ρƒ класса B Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΎΠ½ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса C.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса B ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит. Π‘Π΄Π΅Π»Π°Π² это, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ старого ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ стиля

Π’ Π±ΠΎΠ»Π΅Π΅ старой вСрсии Python (2.1) ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ использованиСм старых классов, Π½ΠΎ Π² Python вСрсии 2.2 ΠΈ Π½ΠΎΠ²Π΅Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ классы. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Python 3 Π΅ΡΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ (Π½ΠΎΠ²Ρ‹Π΅) классы. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт Π½ΠΎΠ²ΠΎΠ³ΠΎ класса стиля наслСдуСтся ΠΎΡ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ класса Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Β» Python. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ –

Π‘Ρ‚ΠΈΠ»ΡŒ объявлСния ΠΎΠ±ΠΎΠΈΡ… классов Ρ€Π°Π·Π½Ρ‹ΠΉ. Π’ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° классы старого стиля ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ «сначала Π² Π³Π»ΡƒΠ±ΠΈΠ½ΡƒΒ» слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ (DLR), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ классы Π½ΠΎΠ²ΠΎΠ³ΠΎ стиля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ C3 ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ мноТСствСнного наслСдования.

Алгоритм DLR

Python создаСт список классов ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ мноТСствСнного наслСдования ΠΌΠ΅ΠΆΠ΄Ρƒ классами. Π­Ρ‚ΠΎΡ‚ список ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ экзСмплярами.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ работая ΠΎΡ‚ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ сначала ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Ρ‚ΠΈ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π‘Π½Π°Ρ‡Π°Π»Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² классС экзСмпляра. Если Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚, ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ классу. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ родитСлям Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса. Π’Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° наслСдования классов.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

Но A Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²Π°ΠΆΠ΄Ρ‹, поэтому –

Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ странноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎ врСмя. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΈΠΆΠ΅.

Богласно Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ DLR, порядок Π±ΡƒΠ΄Π΅Ρ‚ E, C, D, B, A. Π’ классС C происходит ΠΎΠ±ΠΌΠ΅Π½ классами A ΠΈ B, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. Π—Π½Π°Ρ‡ΠΈΡ‚, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π΅ сохраняСт свойство монотонности.

БамуэлС ΠŸΠ΅Ρ€Π΄ΠΎΠ½ΠΈ Π±Ρ‹Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²ΡˆΠΈΠΌ нСсоотвСтствиС ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ MRO.

Алгоритм Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ C3

Алгоритм Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ C3 – Π»ΡƒΡ‡ΡˆΠ°Ρ вСрсия Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° DLR, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ устраняСт Π½Π΅ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

ΠŸΡ€Π°Π²ΠΈΠ»Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ C3

Бпособ для порядка Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Python прСдоставляСт Π΄Π²Π° способа ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса – Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __mro__ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ mro(). Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ порядок ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ C3 Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для мноТСствСнного наслСдования.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС классов.

Python Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ мноТСствСнного наслСдования. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса с нСсколькими Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ классами выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ доступ ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классам, динамичСский Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚ порядок поиска Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ порядок слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ классС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ родитСля Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ являСтся ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½Ρ‹ΠΌ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подклассом, Π½Π΅ затрагивая порядок ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. Π’ совокупности эти свойства ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Π΅ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹Π΅ классы с мноТСствСнным наслСдованиСм.

НапримСр:

НС всС классы ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ MRO.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ для опрСдСлСния ΠΏΡƒΡ‚ΠΈ поиска Π² символичСской Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ (для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹ΡˆΠ΅):

Π”Π°Π»ΡŒΡˆΠ΅ объявляСм класс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π±Π΅Ρ€Ρ‘Ρ‚Π΅ Π½Π° сСбя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° MRO, Python Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ спокойно провСсти поиск Π² ΠΏΡ€Π΅Π΄ΠΊΠ°Ρ… Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‡Π΅ΠΌ Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ…. И хотя это Π½Π΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

ОслоТнСния Π² мноТСствСнном наслСдовании Python.

Π§Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° классы, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… происходит наслСдованиС, ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚? ЧьС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс? Π”Π°Π²Π°ΠΉΡ‚Π΅ возьмСм Ρ‚Ρ€ΠΈ класса А, Π’ ΠΈ Π‘.

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, класс, Π½Π°Π·Π²Π°Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² наслСдовании, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ своС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΌΡƒ классу для ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. Π’ΠΎ ΠΆΠ΅ самоС происходит ΠΈ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ/функциями класса Python.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Python

Π’ этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ рассматриваСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ MRO Π‘3 ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спСцифичСскиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ мноТСствСнного наслСдования. Π₯отя ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°ΠΌΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка, я Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» своё Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ список ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ссылок ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² (method resolution order) позволяСт ΠŸΠΈΡ‚ΠΎΠ½Ρƒ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ класса-ΠΏΡ€Π΅Π΄ΠΊΠ° Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, Ссли ΠΎΠ½ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ нСпосрСдствСнно Π² классС-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅. Если Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€Π΅Π΄ΠΎΠΊ, Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ восходящий поиск ΠΏΠΎ всСй ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ. Если ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ мноТСствСнноС наслСдованиС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ со спСцифичСскими ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ описаны Π½ΠΈΠΆΠ΅.

Π’ старых вСрсиях ΠŸΠΈΡ‚ΠΎΠ½Π° порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±Ρ‹Π» достаточно ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ: поиск вёлся Π²ΠΎ всСх Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классах слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ. Π’.Π΅. Ссли Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½ΠΎ Π±Ρ‹Π»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ, Ρ‚ΠΎ поиск производился Π² Π½ΠΈΡ… ΠΏΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΠ·ΠΌΡ‘ΠΌ структуру:

ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ экзСмпляра класса E Ρ‚Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²Ρ‘Π» Π±Ρ‹ поиск ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² классах E, B, A, D ΠΈ C. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ поиск вёлся сначала Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ классС-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ ΠΈ Π²ΠΎ всСх Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°Ρ…, Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ классС-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ со всСми ΠΏΡ€Π΅Π΄ΠΊΠ°ΠΌΠΈ ΠΈ Ρ‚. Π΄. Π­Ρ‚ΠΎΡ‚ способ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π» особых Π½Π°Ρ€Π΅ΠΊΠ°Π½ΠΈΠΉ, ΠΏΠΎΠΊΠ° Ρƒ классов Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°. Однако, начиная с вСрсии 2.2, появился Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс object, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΎΡΡŒ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы. Π—Π°Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Π²Π²Π΅Π»ΠΈ β€” Ρ‚Π΅ΠΌΠ° для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ сущСствСнным Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ΅Ρ‚Π°-Π΄Π°Π½Π½Ρ‹Ρ…. Начиная с вСрсии 3.0, старыС классы большС Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, Π° всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ происходят ΠΎΡ‚ класса object.

Π­Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Β«Ρ€ΠΎΠΌΠ±ΠΎΠ²ΠΈΠ΄Π½ΠΎΠΉ структуры» (Β«diamond diagramΒ»).

Если Ρƒ нас Π΅ΡΡ‚ΡŒ классы A ΠΈ B, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… наслСдуСтся класс C, Ρ‚ΠΎ ΠΏΡ€ΠΈ поискС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎ старому Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ (C, A, object, B) получаСтся, Ρ‡Ρ‚ΠΎ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² классах C ΠΈ A ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Ρ‘Π½ ΠΈΠ· object, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π² B. Π­Ρ‚ΠΎ создаёт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ нСудобства, Ρ‚.ΠΊ. Π² object ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ магичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‚ΠΈΠΏΠ° __init__, __str__ ΠΈ Ρ‚.ΠΏ. Но Π΄Π°ΠΆΠ΅ Ссли object Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΠΊΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс D, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° останСтся β€” ΠΌΠ΅Π½Π΅Π΅ спСцифичный ΠΌΠ΅Ρ‚ΠΎΠ΄ класса-ΠΏΡ€Π΅Π΄ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ вмСсто Π±ΠΎΠ»Π΅Π΅ спСцифичного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π½Π° Ρ€ΡƒΠΊΠ°Ρ… Π΅ΡΡ‚ΡŒ сам класс, список всСх Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² ΠΈ связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Из этих Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ упорядочСнный список классов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ поиск ΠΌΠ΅Ρ‚ΠΎΠ΄Π° слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. Π’Π°ΠΊΠΎΠΉ список называСтся Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ класса. Для простоты возьмСм структуру:

Π’ΠΎΠ³Π΄Π° Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ для класса B Π±ΡƒΠ΄Π΅Ρ‚ список [B, A, object]. Π’.Π΅. ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ B().something() ΠΌΠ΅Ρ‚ΠΎΠ΄ сначала Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒΡΡ Π² классС B. Если ΠΎΠ½ Ρ‚Π°ΠΌ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ поиск продолТится Π² классС A. Если Π΅Π³ΠΎ Π½Π΅Ρ‚ ΠΈ Ρ‚Π°ΠΌ, Ρ‚ΠΎ поиск Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π² классС object. ΠŸΠ΅Ρ€Π΅Π±Ρ€Π°Π² всС классы ΠΈΠ· Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ² Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠŸΠΈΡ‚ΠΎΠ½ Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Attribute Error.

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€ΠΎΠΌΠ±ΠΎΠ²ΠΈΠ΄Π½ΠΎΠΉ структуры линСаризация Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΠΉ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΠ³ΠΎ класса C класс A слСдуСт Π·Π° классом B (ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ [C, …, B, …, A]), Ρ‚ΠΎ ΠΈ для любого Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° D класс B Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° A Π² Π΅Π³ΠΎ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ [D, …, C, …, B, …, A]). Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, старый порядок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π΅Π½, Ρ‚.ΠΊ. Π² случаС Ρ€ΠΎΠΌΠ±ΠΎΠ²ΠΈΠ΄Π½ΠΎΠΉ структуры для класса A линСаризация Π΅ΡΡ‚ΡŒ [A, object], для класса B β€” [B, object], Π½ΠΎ для класса C β€” [C, A, object, B], Ρ‡Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ свойство монотонности ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ классу B.

Для удовлСтворСния свойству монотонности Π² этом случаС ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚ Π΄Π²Π΅ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ: [C, A, B, object] ΠΈ [C, B, A, object]. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‚ монотонности Π½ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ класса A (Ρ‚.ΠΊ. object слСдуСт Π·Π° A Π² ΠΎΠ±ΠΎΠΈΡ… случаях), Π½ΠΈ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ класса B (Ρ‚.ΠΊ. object слСдуСт Π·Π° B Π² ΠΎΠ±ΠΎΠΈΡ… случаях). Π’Π°ΠΊ ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ· Π½ΠΈΡ… Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ? Π’ этом случаС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ-понятный способ β€” ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса C. Если класс объявлСн ΠΊΠ°ΠΊ C(A, B), Ρ‚ΠΎ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΉ B слСдуСт Π·Π° A. Если класс объявлСн ΠΊΠ°ΠΊ C(B, A), Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅ Π²Π·ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ A слСдуСт Π·Π° B.

Π’Π°ΠΊΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ опрСдСляСтся порядком локального ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π° (local precedence ordering). Бвойство порядка локального ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ соблюдСния для классов-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ порядка, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ Π΅Π³ΠΎ объявлСнии. НапримСр, Ссли класс объявлСн ΠΊΠ°ΠΊ D(A, B, C), Ρ‚ΠΎ Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ D класс A Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚ΠΎΡΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅ B, Π° класс B β€” Ρ€Π°Π½ΡŒΡˆΠ΅ C.

Алгоритм порядка Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² C3.

Для достиТСния ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Ρ†Π΅Π»Π΅ΠΉ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ C3. Он достаточно прост, ΠΎΠ΄Π½Π°ΠΊΠΎ для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания Π²Π²Π΅Π΄Ρ‘ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ условныС обозначСния:
[C1, C2, … CN] – список ΠΈΠ· элСмСнтов C1, C2, … CN. БоотвСтствСнно, [Π‘] β€” список ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта C.
L[C] – линСаризация класса C. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ любая линСаризация Π΅ΡΡ‚ΡŒ список ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ.
merge(L[C1], L[C2], …, L[CN]) – объСдинСниС элСмСнтов Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΉ L[C1], L[C2], …, L[CN] Π² список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. По сути, этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ всС классы ΠΈΠ· L[C1], L[C2], …, L[CN] ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ классов Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΌ спискС.

Наибольший интСрСс прСдставляСт процСсс объСдинСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’ случаях L[A] ΠΈ L[B] Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ merge(L[object], [object]) = merge([object], [object]) раскрываСтся Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ списки состоят ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта object, ΠΏΠΎ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ 4 ΠΏΡ€Π°Π²ΠΈΠ»Π° объСдинСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ [object].

Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ L[C]:
L[C] = [C] + merge(L[D], L[E], [D, E])
L[E] = [E] + merge(L[D], [D])
L[D] = [D] + merge(L[object], [object]) = [D, object]

ΠŸΡ€ΠΎΠ²Π΅Π΄Ρ‘ΠΌ подстановки ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:
L[E] = [E] + merge([D, object], [D]) = [E, D, object]
L[C] = [C] + merge([D, object], [E, D, object], [D, E])

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотритС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ. ОбъСдинСниС merge([D, object], [E, D, object], [D, E]) Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² списках [D, object] ΠΈ [D, E] Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ элСмСнтом являСтся D, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом списка [E, D, object]. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, E, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ элСмСнтом [E, D, object] ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ являСтся ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом [D, E]. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Π΅Ρ€Π΅Π· 3 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ ΠΊ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ 5, послС Ρ‡Π΅Π³ΠΎ ΠŸΠΈΡ‚ΠΎΠ½ Π²Ρ‹ΠΊΠΈΠ½Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError: Cannot create a consistent method resolution order (MRO) for bases D, E. Если Π±Ρ‹ нашС объСдинСниС Π½Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ списком Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ порядка локального ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π°: L[C] = [C] + merge([D, object], [E, D, object]) = [C] + [E] + merge([D, object], [D, object]) = [C] + [E, D] + [object] = [C, E, D, object]. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса C поиск вёлся Π±Ρ‹ сначала Π² классС E, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π² классС D, хотя Π² объявлСнии Π±Ρ‹Π»ΠΎ записано C(D, E).

Π Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π΅ слоТно. Достаточно ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ объявлСниС Π½Π° class C(E, D). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:
L[C] = [C] + merge([E, D, object], [D, object], [E, D]) = [C] + [E] + merge([D, object], [D, object], [D]) = [C] + [E, D, object] = [C, E, D, object].
По сути Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнилось, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² объявлСнии класса порядок пСрСчислСния Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ получился Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса, Ρ‚.Π΅. ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ порядок локального ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Π°. Надо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ хотя ΠŸΠΈΡ‚ΠΎΠ½ ΠΈ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚, Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ, ΠΎΠ½ Π½Π΅ станСт ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ Π²Π°ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ссли Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ свой собствСнный MRO Ρ‡Π΅Ρ€Π΅Π· мСтакласс. Но ΠΎΠ± этом Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ.

ΠŸΠΈΡ‚ΠΎΠ½ вычисляСт Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ создании класса. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π΅Ρ‘ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ для самопровСрки ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ свойство класса __mro__ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, C.__mro__). Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ позаковыристСС. Класс object ΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Ρ‚ΡŒ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Как извСстно ΠΈΠ· сказанного Π²Ρ‹ΡˆΠ΅, ΠΏΡ€ΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌ наслСдовании классы просто Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΊ ΠΏΡ€Π΅Π΄ΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ object всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ любой Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ. И Π΅Ρ‰Ρ‘. Π― Π½Π΅ ΠΊΡƒΠ»ΠΈΠ½Π°Ρ€ ΠΈ Π½Π΅ ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π½Ρ‚, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β€” это всСго лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. НС стоит Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ своё Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° смысловых нСточностях Π² Π½ΠΈΡ….

class Music (object): pass
class Rock (Music): pass
class Gothic (Music): pass
class Metal (Rock): pass
class GothicRock (Rock, Gothic): pass
class GothicMetal (Metal, Gothic): pass
class The69Eyes (GothicRock, GothicMetal): pass

L[The69Eyes] = [The69Eyes] + merge(L[GothicRock], L[GothicMetal], [GothicRock, GothicMetal])
L[GothicRock] = [GothicRock] + merge(L[Rock], L[Gothic], [Rock, Gothic])
L[GothicMetal] = [GothicMetal] + merge(L[Metal], L[Gothic], [Metal, Gothic])
L[Rock] = [Rock, Music]
L[Gothic] = [Gothic, Music]
L[Metal] = [Metal] + [Rock, Music] = [Metal, Rock, Music]

ПослС подстановок ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:
L[GothicRock] = [GothicRock] + merge([Rock, Music], [Gothic, Music], [Rock, Gothic]) = [GothicRock, Rock, Gothic, Music]
L[GothicMetal] = [GothicMetal] + merge([Metal, Rock, Music], [Gothic, Music], [Metal, Gothic]) = [GothicMetal] + [Metal, Rock, Gothic, Music] = [GothicMetal, Metal, Rock, Gothic, Music]
L[The69Eyes] = [The69Eyes] + merge([GothicRock, Rock, Gothic, Music], [GothicMetal, Metal, Rock, Gothic, Music], [GothicRock, GothicMetal])
= [The69Eyes] + [GothicRock, GothicMetal] + merge([Rock, Gothic, Music], [Metal, Rock, Gothic, Music])
= [The69Eyes] + [GothicRock, GothicMetal, Metal] + merge([Rock, Gothic, Music], [Rock, Gothic, Music])
= [The69Eyes, GothicRock, GothicMetal, Metal, Rock, Gothic, Music]

class Food (object): pass
class Meat (Food): pass
class Milk (Food): pass
class Flour (Food): pass
class Rabbit (Meat): pass
class Pork (Meat): pass
class Pasty (Milk, Flour): pass
class Pie (Rabbit, Pork, Pasty): pass

L[Pie] = [Pie] + merge(L[Rabbit], L[Pork], L[Pasty], [Rabbit, Pork, Pasty])
L[Rabbit] = [Rabbit] + merge(L[Meat], [Meat])
L[Pork] = [Pork] + merge(L[Meat], [Meat])
L[Pasty] = [Pasty] + merge(L[Milk], L[Flour], [Milk, Flour])
L[Meat] = [Meat] + merge(L[Food], [Food]) = [Meat, Food]
L[Milk] = [Milk] + merge(L[Food], [Food]) = [Milk, Food]
L[Flour] = [Flour] + merge(L[Food], [Food]) = [Flour, Food]

ПослС подстановок ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ:
L[Rabbit] = [Rabbit, Meat, Food]
L[Pork] = [Pork, Meat, Food]
L[Pasty] = [Pasty] + merge([Milk, Food], [Flour, Food], [Milk, Flour]) = [Pasty] + [Milk, Flour, Food] = [Pasty, Milk, Flour, Food]
L[Pie] = [Pie] + merge([Rabbit, Meat, Food], [Pork, Meat, Food], [Pasty, Milk, Flour, Food], [Rabbit, Pork, Pasty])
= [Pie] + [Rabbit] + merge([Meat, Food], [Pork, Meat, Food], [Pasty, Milk, Flour, Food], [Pork, Pasty])
= [Pie] + [Rabbit, Pork] + merge([Meat, Food], [Meat, Food], [Pasty, Milk, Flour, Food], [Pasty])
= [Pie] + [Rabbit, Pork, Meat] + merge([Food], [Food], [Pasty, Milk, Flour, Food], [Pasty])
= [Pie] + [Rabbit, Pork, Meat, Pasty] + merge([Food], [Food], [Milk, Flour, Food])
= [Pie] + [Rabbit, Pork, Meat, Pasty, Milk, Flour, Food]
= [Pie, Rabbit, Pork, Meat, Pasty, Milk, Flour, Food]

Как ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€Π΅Π΄ΠΊΠ°ΠΌ.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Ρƒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. На самом Π΄Π΅Π»Π΅ нСпосрСдствСнный поиск ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классах β€” это лишь Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ. Как ΠΈ Π² случаС ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ наслСдования, часто ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ сСбС Тизнь, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΈΠΌΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… дСйствий Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΌΠ΅Ρ‚ΠΎΠ΄ родитСля. НапримСр, достаточно часто ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅:
class B (A):
def __init__ (self):
# something
A. __init__ (self)

Однако, для случая мноТСствСнного наслСдования этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ годится. И Π²ΠΎΡ‚ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:
class C (B, A):
def __init__ (self):
# something
B. __init__ (self)
A. __init__ (self)

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ явно обращаСмся ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ классам (Π²ΠΎΠΎΠ±Ρ‰Π΅-Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ наслСдованиСм Ρ‚ΠΎ ΠΆΠ΅ самоС). Если ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ класс ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ, Ρ‚ΠΎ Π½Π°ΠΌ придётся ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊ Π½Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ. Π­Ρ‚ΠΎ Ρ‡Ρ€Π΅Π²Π°Ρ‚ΠΎ Π±Π°Π³Π°ΠΌΠΈ, Ссли ΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ пропустим. Но это Π΅Ρ‰Ρ‘ ΠΏΠΎΠ» Π±Π΅Π΄Ρ‹. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΎ классах A ΠΈ B. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΊΠΈ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
class A (P1, P2):
def __init__ (self):
# something
P1. __init__ (self)
P2. __init__ (self)

class B (P1, P2):
def __init__ (self):
# something
P1. __init__ (self)
P2. __init__ (self)

Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ получится, Ρ‡Ρ‚ΠΎ инициализация ΠΎΠ±Ρ‰ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π²Π° Ρ€Π°Π·Π°. Π­Ρ‚ΠΎ Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π΅ΡΡ‚ΡŒ класс super. Π’ вСрсии 3.0 ΠΎΠ½ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π»ΠΎΠ²Π΅Ρ‡Π΅Π½ ΠΈ ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
class C (B, A):
def __init__ (self):
# something
super (). __init__ () # для вСрсий младшС 3.0 Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ super(C, self)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² вСрсиях 2.x ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ сам класс, Π° Π½Π΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Π³ΠΎ родитСля. По сути, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса super Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Ρ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΠΌΡƒ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ любого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (super().__init__(self) Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅) ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ списку Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ класса Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° (self.__class__.__mro__), ΠΏΡ‹Ρ‚Π°ΡΡΡŒ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для всСх классов, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° классом Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ (класс C), пСрСдавая Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ (self). Π’.Π΅. для нашСго случая:
self.__class__.__mro__ = [C, B, A, P1, P2, …]
super(C, self).__init__() => B.__init__(self)
super(B, self).__init__() => A.__init__(self)
super(A, self).__init__() => P1.__init__(self)
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° B.__init__ ΠΏΡ€ΠΈ использовании super Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ A.__init__, хотя класс A с Π½ΠΈΠΌ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связан ΠΈ Π½Π΅ являСтся Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ. Π’ этом случаС ΠΏΡ€ΠΈ нСобходимости ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ всСх ΠΏΡ€Π΅Π΄ΠΊΠΎΠ².

Благодаря Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ввСсти для рассмотрСнного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° с ΠΏΠΈΡ€ΠΎΠ³ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ allergen для всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ проходя ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ список всСх Π°Π»Π»Π΅Ρ€Π³Π΅Π½ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»Π΅ΠΉ. Π‘ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄ΠΎΠ±Π½ΠΎ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· список Β«Π½Π΅ рСкомСндуСтся» для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° просто ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π’ΠΎΠ³Π΄Π° список Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ автоматичСски. Аналогично ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π° Π²Ρ‹Π±ΠΎΡ€ Π½Π°ΠΏΠΈΡ‚ΠΊΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρƒ, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ вСса ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° самописной ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-радиостанции, идя ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊ ΠΆΠ°Π½Ρ€Π°ΠΌ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ коэффициСнтом затухания.

class Meat (Food):
def drink(self):
return [ ‘Red wine’ ] + super (Meat, self).drink()

class Milk (Food):
def allergen(self):
return [ ‘Milk-protein’ ] + super (Milk, self).allergen()

class Flour (Food): pass

class Rabbit (Meat):
def drink(self):
return [ ‘Novello wine’ ] + super (Rabbit, self).drink()

class Pork (Meat):
def drink(self):
return [ ‘Sovinion wine’ ] + super (Pork, self).drink()
def allergen(self):
return [ ‘Pork-protein’ ] + super (Pork, self).allergen()

class Pasty (Milk, Flour): pass

class Pie (Rabbit, Pork, Pasty):
def drink(self):
return [ ‘Mineral water’ ] + super (Pie, self).drink()

if __name__ == «__main__» :
pie = Pie()

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого списка, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ обходился список Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ Π² спискС Π°Π»Π»Π΅Ρ€Π³Π΅Π½ΠΎΠ² ΠΈΠ»ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈΡΡŒ Π±Ρ‹ повторСния. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² самом ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌ классС Food ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΠ±Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” allergen ΠΈ drink. Π’Ρ‹Π·ΠΎΠ² super() Π½Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ пытаСмся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ Ρ‚ΠΈΠΏΠ° AttributeError: ‘super’ object has no attribute ‘allergen’.

Когда линСаризация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ составлСна.

Π’Ρ‹ΡˆΠ΅ ΡƒΠΆΠ΅ Π±Ρ‹Π» Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ случай, ΠΊΠΎΠ³Π΄Π° ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ C3 Π±Ρ‹Π»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Однако, Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠΈΠ»Π°ΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΉ мСст классов-ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² Π² объявлСнии класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ случай, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… составлСниС Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ:
class C (A, B): pass
class D (B, A): pass
class E (C, D): pass

L[E] = [E] + merge(L[C], L[D], [C, D]) = [E] + merge([C, A, B], [D, B, A], [C, D])
= [E] + [C, D] + merge([A, B], [B, A])

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ получился Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΡ‹ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² объявлСнии C класс A стоит ΠΏΠ΅Ρ€Π΅Π΄ B, Π° Π² объявлСнии D β€” Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. По-Ρ…Ρ€ΠΎΡˆΠ΅ΠΌΡƒ, с этого мСста Π½Π°Π΄ΠΎ ΠΈΠ΄Ρ‚ΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ структуру. Но Ссли Π²Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°Π΄ΠΎ быстро ΠΏΠΎΠ΄Ρ…Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π²Ρ‹ просто Π·Π½Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚Π΅, ΠŸΠΈΡ‚ΠΎΠ½ Π½Π΅ станСт вас ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ. Бвою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· мСтаклассы. Для этого достаточно Π² мСтаклассС ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ mro(cls) β€” ΠΏΠΎ сути, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ мСтакласса type, β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½Ρ‘Ρ‚ Π½ΡƒΠΆΠ½ΡƒΡŽ Π²Π°ΠΌ Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ.
class MetaMRO ( type ):
def mro(cls):
return (cls, A, B, C, D object)

Π”Π°Π»ΡŒΡˆΠ΅ объявлСниС класса различаСтся для вСрсии 3.0 ΠΈ 2.x:
class E (C, D): __metaclass__ = MetaMRO # 2.x
class E (C, D, metaclass = MetaMRO): pass # 3.0

ПослС этого E.__mro__ = [E, A, B, C, D, object]. Π—Π°ΠΌΠ΅Ρ‚Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π±Π΅Ρ€Ρ‘Ρ‚Π΅ Π½Π° сСбя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° MRO ΠŸΠΈΡ‚ΠΎΠ½ Π½Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ спокойно провСсти поиск Π² ΠΏΡ€Π΅Π΄ΠΊΠ°Ρ… Ρ€Π°Π½ΡŒΡˆΠ΅ Ρ‡Π΅ΠΌ Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ…. И хотя это Π½Π΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки:
Unifying types and classes in Python 2.2 β€” ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ΅Ρ‚Π°-Π΄Π°Π½Π½Ρ‹Ρ…. Π—Π΄Π΅ΡΡŒ ΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ MRO, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ мноТСствСнного наслСдования ΠΈ super().
The Python 2.3 Method Resolution Order β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ C3 с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ. Π’ ΠΊΠΎΠ½Ρ†Π΅ Π΅ΡΡ‚ΡŒ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mro ΠΈ merge Π½Π° чистом ΠŸΠΈΡ‚ΠΎΠ½Π΅ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ воспринимаСт ΠΊΠΎΠ΄ Ρ‡Π΅ΠΌ тСкст.
A Monotonic Superclass Linearization for Dylan β€” сравнСниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² Π»ΠΈΠ½Π΅Π°Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ПослСсловиС.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *