Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠΈΡ‚ΠΎΠ½ - ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, классы, экзСмпляры (БИ)Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 2

Автор Π‘Ρ€ΠΎΠΉΡ‚ΠΌΠ°Π½ ОлСг

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΠΈΡ‚ΠΎΠ½ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык со мноТСствСнным наслСдованиСм. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠŸΠΈΡ‚ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ОО-модСль с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ особСнностями. ΠšΠ»Π°ΡΡΡ‹ Π² Python ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, раздСляСмыС всСми экзСмплярами класса, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ статичСских ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ относятся ΠΊ экзСмплярам класса. ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π² наслСдниках. Бсылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (экзСмпляр класса) пСрСдаСтся Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² явном Π²ΠΈΠ΄Π΅, Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅. Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ self. Какого-Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ° всСх классов (Ρ‚ΠΈΠΏΠ° Object) Π² Python Π½Π΅Ρ‚. Π’ΠΎΠΎΠ±Ρ‰Π΅ Π² ОО-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΊΡ‚ΠΎ ΠΎΡ‚ ΠΊΠΎΠ³ΠΎ наслСдуСтся, Π° ΠΊΠ°ΠΊΠΎΠΉ поддСрТиваСтся интСрфСйс; наслСдованиС лишь Π΄Π°Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ интСрфСйсов ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² язык ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ; Zope Π΄Π΅Π»Π°Π΅Ρ‚ шаги Π² этом Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΈ дСструктор класса Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ __init__ ΠΈ __del__ (встроСнныС ΠΈ слуТСбныС ΠΈΠΌΠ΅Π½Π° Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ двумя подчСркиваниями ΠΏΠ΅Ρ€Π΅Π΄ ΠΈ послС ΠΈΠΌΠ΅Π½ΠΈ; это всСго лишь соглашСниС, язык Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ программисту ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ). Π’Π΅Ρ€Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°Π·Π²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ initializer ΠΈ finalizer - ΠΎΠ½ΠΈ сами Π½Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ ΠΈ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ (это Π΄Π΅Π»Π°Π΅Ρ‚ Π·Π° Π½ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€), ΠΎΠ½ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΈ ΠΎΡ‡ΠΈΡ‰Π°ΡŽΡ‚ свои ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π’ ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π½Π΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new для создания экзСмпляров класса. Для создания экзСмпляра класса вызываСтся класс с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² __init__. ΠœΠ΅Ρ‚ΠΎΠ΄ __del__, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, вызываСтся Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (ΠΊΡ€ΠΎΠΌΠ΅, СстСствСнно, self). Для удалСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ экзСмпляров классов) Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ del.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€.

class Foo:

bar = "baz"

def __init__(self, foo):

self.foo = foo

def __del__(self):

del self.foo

foo = Foo(12)

del foo

ОписаниС класса создаСт Π½ΠΎΠ²ΠΎΠ΅ пространство ΠΈΠΌΠ΅Π½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это bar) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляра ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ пространство ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ экзСмпляра класса foo, Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса - Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ self.

ΠšΠ»Π°ΡΡΡ‹ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ программисту ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ для Π½ΠΈΡ… всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, доступныС для встроСнных Ρ‚ΠΈΠΏΠΎΠ². НапримСр, ΠΌΠ΅Ρ‚ΠΎΠ΄ __getitem__ позволяСт ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° __setitem__ - ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ индСксу ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ __getitem__ Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ for, эмулируя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (sequence). Π•ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ булСвскиС значСния ΠΈ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… if ΠΈ while. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ __getattr__ ΠΈ __setattr__ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠœΠ΅Ρ‚ΠΎΠ΄ __call__ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ экзСмпляр класса с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ!

Python позволяСт ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ всС инфиксныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° выраТСния. НапримСр, Ссли a - экзСмпляр класса A, ΠΈ b - экзСмпляр класса B, Ρ‚ΠΎ для вычислСния выраТСния aΒ +Β b ΠŸΠΈΡ‚ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ сначала ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ __add__ Π² классС A, Π° Ссли Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ - Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ __radd__ Π² классС B (Π° Ссли ΠΈ Ρ‚Π°ΠΌ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ - Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ TypeError).

МногиС программисты, особСнно писавшиС Π½Π° C++, боятся ΠΈ Π½Π΅ Π»ΡŽΠ±ΡΡ‚ мноТСствСнного наслСдования. Авторы языка Java Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ мноТСствСнноС наслСдованиС Π² язык. Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ напрасно! Python позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мноТСствСнноС наслСдованиС вСсьма ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΎΠ΅ наслСдованиС ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° (code reuse) вмСсто copy/paste-программирования, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΈ для эффСктивности, ΠΈ для читаСмости ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Часто программисты Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ класс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мноТСствСнного наслСдования ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… связанных ΠΌΠ΅ΠΆΠ΄Ρƒ собой "ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠΎΠ²", словно ΠΈΠ· конструктора. Π’Π°ΠΊΠΈΠ΅ "ΠΊΠΈΡ€ΠΏΠΈΡ‡ΠΈΠΊΠΈ" Π² ОО-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ MixIn-классами. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΡ€ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MixIn-классов ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Π² Linux Journal

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ использования классов (Ρ‚ΠΎΡ‡Π½Π΅Π΅, экзСмпляров), Π½Π΅ связанный нСпосрСдствСнно с ОО-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ - использованиС пространства ΠΈΠΌΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдоставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π’Π°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ списку, сохраняя ΠΌΠ΅ΠΆΠ΄Ρƒ итСрациями Ρ†ΠΈΠΊΠ»Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»ΠΎΠΌ for, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. А ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ возмоТностями Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² ΠŸΠΈΡ‚ΠΎΠ½Π΅ - функциями map, filter, reduce ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ Π² процСссС Ρ†ΠΈΠΊΠ»Π° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚. Π­Ρ‚ΠΎ эффСктивнСС, Ρ‡Π΅ΠΌ Ρ†ΠΈΠΊΠ» for (эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‚ΠΎ написаны Π½Π° C), Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ состояния ΠΌΠ΅ΠΆΠ΄Ρƒ итСрациями. Ѐункция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ map ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ состояниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Для простых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ это Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ. Но Π²ΠΎΡ‚, скаТСм, с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΈΡ€Π°Ρ‚ΡŒ ΠΈ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Π”Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π½Π°Π΄ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ Π½ΡƒΠΆΠ΄Π΅.

Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство ΠΈΠΌΠ΅Π½, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π² экзСмплярС класса. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс

class Process:

def __init__(self):

self.foo = 0

def __call__(self, v):

if self.foo > 100:

raise OverflowError

self.foo += v

return self.foo

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ экзСмпляр этого класса: pΒ =Β Process(), ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² map вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: resultΒ =Β map(p,Β sequence). Ѐункция map, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ подозрСвая, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ. Никаких ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ - ΠΌΡ‹ Ρ‚Π°ΠΊ описали класс, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ экзСмпляры ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ! И ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ p сохраняСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ состояниС.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class Process:

def __init__(self):

self.sum = 0

def add(self, v):

self.sum += v

return self.sum

p = Process()

result = map(p.add, sequence)

print p.sum

Вся Ρ€Π°Π·Π½ΠΈΡ†Π° Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ - ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ p, Π° Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ p.add. Но Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ p.add? Π’ Python это особая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, называСмая BoundMethod. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠ½ΠΈΡ‚ адрСс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° p, адрСс Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add класса Process, ΠΈ, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса с ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ self. Если ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ этому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΊΠ°ΠΊ Process.add, Ρ‚ΠΎ это - UnboundMethod, ΠΈ Π΅Π³ΠΎ Π½Π°Π΄ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ, подставив всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² явном Π²ΠΈΠ΄Π΅: Process.add(p,Β 1). Π’Ρ‹Π·ΠΎΠ² Π² Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ конструктора ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: