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

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

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

РазумССтся, ΠΏΡ€ΠΈ «чистой» Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΈ цикличСских ссылок Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚.

НапримСр, ΠΏΡ€ΠΈ прСдставлСнии Π΄Π΅Ρ€Π΅Π²Π° ссылки ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ΄Ρ‚ΠΈ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΊ дСтям ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΎΡ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΡƒΠ·Π»Π° ΠΊ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ.

Π‘Π»Π°Π±Ρ‹Π΅ ссылки

Для обСспСчСния ассоциаций ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· свойствСнных ссылкам ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ образования цикличСских ссылок, Π² Python для слоТных структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² использования, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ссылки Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, прСдлагаСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ слабых ссылок. Вакая ссылка Π½Π΅ учитываСтся ΠΏΡ€ΠΈ подсчСтС ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ удаляСтся с исчСзновСниСм послСднСй «сильной» ссылки.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со слабыми ссылками примСняСтся ΠΌΠΎΠ΄ΡƒΠ»ΡŒ weakref. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ станут понятны ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

>>> import weakref

>>>

>>> class MyClass(object):

... def __str__(self):

...  return "MyClass"

...

>>>

>>> s = MyClass() # создаСтся экзСмпляр класса

>>> print s

MyClass

>>> s1 = weakref.proxy(s) # создаСтся ΠΏΡ€ΠΎΠΊΡΠΈβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

>>> print s1      # ΠΏΡ€ΠΎΠΊΡΠΈβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ исходный

MyClass

>>> ss = weakref.ref(s)   # создаСтся слабая ссылка Π½Π° Π½Π΅Π³ΠΎ

>>> print ss()    # Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ссылки получаСтся исходный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

MyClass

>>> del s         # удаляСтся СдинствСнная сильная ссылка Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

>>> print ss()    # Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ исходного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ сущСствуСт

None

>>> print s1

Traceback (most recent call last):

 File "<stdin>", line 1, in ?

ReferenceError: weakly–referenced object no longer exists

К соТалСнию, ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΊΡΠΈβ€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ совсСм Ρ‚Π°ΠΊΠΎΠ΅, ΠΊΠ°ΠΊ Ρƒ исходного: ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ словаря, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ являСтся Π½Π΅Ρ…ΡΡˆΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ.

БтатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄

Иногда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ классу, Π° Π½Π΅ Π΅Π³ΠΎ экзСмпляру. Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄. Π”ΠΎ появлСния Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² (Π΄ΠΎ Python 2.4) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

class A(object):

 def name():

  return A.__name__

 name = staticmethod(name)


print A.name()

a = A()

print a.name()

БтатичСскому ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π½Π΅ пСрСдаСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с экзСмпляром класса. Он Π΅ΠΌΡƒ попросту Π½Π΅ Π½ΡƒΠΆΠ΅Π½.

Π’ Python 2.4 для примСнСния описатСлСй (descriptors) Π±Ρ‹Π» ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ Π½ΠΎΠ²Ρ‹ΠΉ синтаксис β€” Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹:

class A(object):


 @staticmethod

 def name():

  return A.__name__

Бмысл Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ «пропускаСт» ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄) Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Π² Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ name Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π° Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

ΠœΠ΅Ρ‚ΠΎΠ΄ класса

Если статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ свои Π°Π½Π°Π»ΠΎΠ³ΠΈ Π² C++ ΠΈ Java, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ класса основан Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Python классы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ класса ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚β€“ΠΊΠ»Π°ΡΡ. ВмСсто self для подчСркивания принадлСТности ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ класса принято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ cls.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΌΠ΅Ρ‚ΠΎΠ΄Π° класса ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ tree ΠΏΠ°ΠΊΠ΅Ρ‚Π° nltk (Natural Language ToolKit, Π½Π°Π±ΠΎΡ€ инструмСнтов для СстСствСнного языка). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ лишь Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ опрСдСлСния класса Tree (Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для Π΄Ρ€ΡƒΠ³ΠΈΡ… подклассов). ΠœΠ΅Ρ‚ΠΎΠ΄ convert класса Tree опрСдСляСт ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ прСобразования Π΄Π΅Ρ€Π΅Π²Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² Π΄Π΅Ρ€Π΅Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° абстрагируСтся ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², описывая ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прСобразования:

class Tree:

 # ...

 def convert(cls, val):


  if isinstance(val, Tree):

   children = [cls.convert(child) for child in val]

   return cls(val.node, children)

  else:

   return val

 convert = classmethod(convert)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования (взят ΠΈΠ· строки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° convert()):

>>> # ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ tree Π² экзСмпляр класса Tree

>>> tree = Tree.convert(tree)

>>> # " " " " " ParentedTree

>>> tree = ParentedTree.convert(tree)

>>> # " " " " " MultiParentedTree

>>> tree = MultiParentedTree.convert(tree)

ΠœΠ΅Ρ‚ΠΎΠ΄ класса позволяСт Π±ΠΎΠ»Π΅Π΅ СстСствСнно ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны Π² основном с классами, Π° Π½Π΅ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ экзСмпляра класса.

ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡΡ‹

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ классами являСтся ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ класс–мСтакласс. ΠœΠ΅Ρ‚Π°ΠΊΠ»Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«Π²Ρ‹ΡΡˆΠΈΠΌ ΠΏΠΈΠ»ΠΎΡ‚Π°ΠΆΠ΅ΠΌΒ» ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎβ€“ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, Π½ΠΎ, ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π² Python ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС мСтаклассы.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ класс пороТдаСтся динамичСски Π² функции–фабрикС классов:

def cls_factory_f(func):

 class X(object):

  pass

 setattr(X, func.__name__, func)

 return X

ИспользованиС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

def my_method(self):

 print "self:", self


My_Class = cls_factory_f(my_method)

my_object = My_Class()

my_object.my_method()

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция cls_factory_f() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ класс с СдинствСнным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция, пСрСданная Π΅ΠΉ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. ΠžΡ‚ этого класса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляры, Π° Π·Π°Ρ‚Π΅ΠΌ Ρƒ экзСмпляров β€” Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ my_method.

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

Π’ Python имССтся класс type, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π΄Π΅Π»Π΅ являСтся мСтаклассом. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΅Π³ΠΎ конструктора ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ класс:

def my_method(self):

 print "self:", self


My_Class = type('My_Class', (object,), {'my_method': my_method})

Π’ качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° type пСрСдаСтся имя класса, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы для Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получится класс, эквивалСнтный ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

class My_Class(object):

 def my_method(self):

  print "self:", self

Но самоС интСрСсноС начинаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ собствСнный мСтакласс. ΠŸΡ€ΠΎΡ‰Π΅ всСго Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ мСтакласс ΠΎΡ‚ мСтакласса type (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ взят ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Дэвида ΠœΠ΅Ρ€Ρ‚Ρ†Π°):

>>> class My_Type(type):

...  def __new__(cls, name, bases, dict):

...   print "Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ класс", name

...   return type.__new__(cls, name, bases, dict)

...  def __init__(cls, name, bases, dict):

...   print "Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ класса", name

...   return super(My_Type, cls).__init__(cls, name, bases, dict)

...

>>> my = My_Type("X", (), {})

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ класс X

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ класса X

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ происходит Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π² созданиС класса. Но Π² __new__() ΠΈ __init__() имССтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ создаваСмым классом Π² ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ выполнСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² мСтаклассах принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ self, Π° cls, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ экзСмпляр, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ программист, являСтся Π½Π΅ просто ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° классом.

ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

НСкоторыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎβ€“ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Β«ΡˆΡ‚ΡƒΡ‡ΠΊΠΈΒ» Π½Π΅ входят Π² стандартный Python ΠΈΠ»ΠΈ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. НиТС Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ β€” ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ сразу Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… классов. НапримСр, слоТСниС Π΄Π²ΡƒΡ… чисСл Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² фактичСски Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ использования ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Если Β«ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉΒ» ΠΌΠ΅Ρ‚ΠΎΠ΄ достаточно Π·Π°Π΄Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, Ρ‚ΠΎ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ задания для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сочСтания классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ обслуТиваСт:

>>> import operator

>>> operator.add(1, 2)

3

>>> operator.add(1.0, 2)

3.0

>>> operator.add(1, 2.0)

3.0

>>> operator.add(1, 1+2j)

(2+2j)

>>> operator.add(1+2j, 1)

(2+2j)

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ operator.add Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄, выполняя Ρ€Π°Π·Π½Ρ‹Π΅ дСйствия для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ собствСнных ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Multimethod (Π°Π²Ρ‚ΠΎΡ€ Neel Krishnaswami), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ модуля, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ построСниС собствСнного ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

from Multimethod import Method, Generic, AmbiguousMethodError


# классы, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄

class A: pass

class B(A): pass


# Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Π°

def m1(a, b): return 'AA'

def m2(a, b): return 'AB'

def m3(a, b): return 'BA'


# ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚ΠΎΠ΄Π° (Π±Π΅Π· ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ)