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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 18

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

>>> c.x = 1

>>> print c.x

1

>>> del c.x

А Π½Π° самом Π΄Π΅Π»Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: setx(), getx(), delx().

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² экзСмплярС класса Π² Python ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ (Π΄Π°ΠΆΠ΅ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ) Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, обрабатывая запрос Π½Π° доступ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

__getattr__(self, name) Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° вызываСтся Π² Ρ‚ΠΎΠΌ случаС, Ссли Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом (Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² Π΄Π°Π½Π½ΠΎΠΌ экзСмплярС ΠΈΠ»ΠΈ Π² Π΄Π΅Ρ€Π΅Π²Π΅ классов). Π—Π΄Π΅ΡΡŒ name β€” имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π±ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ AttributeError. Для получСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ контроля Π½Π°Π΄ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ Π² Β«Π½ΠΎΠ²Ρ‹Ρ…Β» классах (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ… object) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ __getattribute__(). __setattr__(self, name, value) Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΏΡ€ΠΈ присваивании значСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ __getattr__(), ΠΌΠ΅Ρ‚ΠΎΠ΄ всСгда вызываСтся, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Π² экзСмплярС класса, поэтому Π½ΡƒΠΆΠ½ΠΎ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. Для присваивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ __dict__: self.__dict__[name] = value ΠΈΠ»ΠΈ (для Β«Π½ΠΎΠ²Ρ‹Ρ…Β» классов) β€” ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ __setattr__() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса: object.__setattr__(self, name, value). __delattr__(self, name) Как ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ ΠΈΠ· названия, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ слуТит для удалСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ нСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт всС пСрСчислСнныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠ· словаря создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ словаря, Π° значСниями β€” значСния ΠΈΠ· словаря ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡Π°ΠΌ:

class AttDict(object):

 def __init__(self, dict=None):

  object.__setattr__(self, '_selfdict', dict or {})


 def __getattr__(self, name):

  if self._selfdict.has_key(name):

   return self._selfdict[name]

  else:

   raise AttributeError


 def __setattr__(self, name, value):

  if name[0] != '_':

   self._selfdict[name] = value

  else:

   raise AttributeError


 def __delattr__(self, name):

  if name[0] != '_' and self._selfdict.has_key(name):

   del self._selfdict[name]


ad = AttDict({'a': 1, 'b': 10, 'c': '123'})

print ad.a, ad.b, ad.c

ad.d = 512

print ad.d

Π‘ΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ ("_") Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠΌΠ΅Π½ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² общСдоступный интСрфСйс. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² языкС Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ особой Ρ€ΠΎΠ»ΠΈ, Π½ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ программисту: «этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования». Π”Π²ΠΎΠΉΠ½ΠΎΠ΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ β€” ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ. ΠŸΡ€ΠΈ этом Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ всС ΠΆΠ΅ доступСн, Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π½ΠΈΠΆΠ΅:

>>> class X:

... x = 0

... _x = 0

... __x = 0

...

>>> dir(X)

['_X__x', '__doc__', '__module__', '_x', 'x']

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ

Π’ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ с грСчСского ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«ΠΌΠ½ΠΎΠ³ΠΎΡ„ΠΎΡ€ΠΌΠΈΠ΅Β». Π’Π°ΠΊ Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ для выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… дСйствий.

МоТно Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ мноТСство ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° (Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ нСсколько Π²ΠΈΠ΄ΠΎΠ² ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°) Π² зависимости ΠΎΡ‚ языка программирования. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° проявлСния ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° приводят ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² подклассах. ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° β€” экзСмпляра Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, Π° Π² качСствС фактичСского Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляр подкласса. Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π° Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ дСйствия. Π’ связи с этим ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ с ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠ΅ΠΉ наслСдования.

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

ΠŸΡ€ΠΈ написании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ провСряСтся, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ (классу) относится Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚: Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ просто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ. Π’Π΅ΠΌ самым Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ максимально ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ: ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²β€“ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² большСго, Ρ‡Π΅ΠΌ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСмантикой.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ свойствСнСн Python:

def get_last(x):

 return x[-1]


print get_last([1, 2, 3])

print get_last("abcd")

Описанной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° всС, ΠΎΡ‚ Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ индСкс–1 (послСдний элСмСнт). Однако сСмантика «взятиС послСднСго элСмСнта» выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ. Ѐункция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ для словарСй, Π½ΠΎ смысл ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ²

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ понятия ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ собствСнный Ρ‚ΠΈΠΏ, ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° встроСнный Ρ‚ΠΈΠΏ «функция». ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ класс, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΈΠ»ΠΈ функциям, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

class CountArgs(object):

 def __call__(self, *args, **kwargs):

  return len(args) + len(kwargs)


cc = CountArgs()

print cc(1, 3, 4)

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, экзСмпляры класса CountArgs ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ функциям (Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ количСство ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²). ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° экзСмпляра Π½Π° самом Π΄Π΅Π»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ __call__() со всСми Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сравнСниСм экзСмпляров класса Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ:

class Point:

 def __init__(self, x, y):

  self.coord = (x, y)

 def __nonzero__(self):

  return self.coord[0] != 0 or self.coord[1] != 0

 def __cmp__(self, p):

  return cmp(self.coord, p.coord)


for x in range(-3, 4):

 for y in range(-3, 4):

  if Point(x, y) < Point(y, x):

   print "*",

  elif Point(x, y):

   print ".",

  else:

   print "o",

 print

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚:

. * * * * * *

. . * * * * *

. . . * * * *

. . . o * * *

. . . . . * *

. . . . . . *

. . . . . . .

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ класс Point (Π’ΠΎΡ‡ΠΊΠ°) ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ __nonzero__(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт истинностноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса. Π˜ΡΡ‚ΠΈΠ½Ρƒ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ (0, 0). Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” __cmp__() β€” вызываСтся ΠΏΡ€ΠΈ нСобходимости ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ coord, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΊΠΎΡ€Ρ‚Π΅ΠΆ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… элСмСнтов). НуТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ вмСсто __cmp__ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сравнСния: __lt__, __le__, __ne__, __eq__, __ge__, __gt__ (для <, <=, !=, ==, >=, > соотвСтствСнно).

Достаточно Π»Π΅Π³ΠΊΠΎ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ числовыС Ρ‚ΠΈΠΏΡ‹. Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ удобством синтаксиса инфиксного +, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

class Plussable:

 def __add__(self, x):

  ...

 def __radd__(self, x):

  ...

 def __iadd__(self, x):

  ...

Π—Π΄Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ __add__() вызываСтся, ΠΊΠΎΠ³Π΄Π° экзСмпляр класса Plussable стоит слСва ΠΎΡ‚ слоТСния, __radd__() β€” Ссли справа ΠΎΡ‚ слоТСния ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ слСва ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __add__(). ΠœΠ΅Ρ‚ΠΎΠ΄ __iadd__() Π½ΡƒΠΆΠ΅Π½ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ +=.

ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ классами 

НаслСдованиС

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ситуация, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π±Π»ΠΈΠ·ΠΊΠΈΠ΅, Π½ΠΎ вмСстС с Ρ‚Π΅ΠΌ Π½Π΅ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ классы. Одним ΠΈΠ· способов сокращСния описания классов Π·Π° счСт использования ΠΈΡ… сходства являСтся выстраиваниС классов Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ. Π’ ΠΊΠΎΡ€Π½Π΅ этой ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ стоит Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ классы ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ свои Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, уточняя ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ‹ΡˆΠ΅Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ класса. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠΌ построСния классификации являСтся ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Β«IS–AΒ» (Β«Π•Π‘Π’Π¬Β»). НапримСр, класс ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ β€” графичСском Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ унаслСдован ΠΎΡ‚ класса ГСомСтричСская Π€ΠΈΠ³ΡƒΡ€Π°. ΠŸΡ€ΠΈ этом ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ подклассом (ΠΈΠ»ΠΈ субклассом) для класса ГСомСтричСская Π€ΠΈΠ³ΡƒΡ€Π°, Π° ГСомСтричСская Π€ΠΈΠ³ΡƒΡ€Π° β€” надклассом (ΠΈΠ»ΠΈ супСрклассом) для класса ΠžΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π’ языкС Python Π²ΠΎ Π³Π»Π°Π²Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ (Β«Π½ΠΎΠ²Ρ‹Ρ…Β») классов стоит класс object. Для ΠΎΡ€ΠΈΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π½ΠΈΠΆΠ΅. Ѐункция issubclass(x, y) ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, являСтся Π»ΠΈ класс x подклассом класса y: