Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΠΏΡΠΈ Β«ΡΠΈΡΡΠΎΠΉΒ» Π°Π³ΡΠ΅Π³Π°ΡΠΈΠΈ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²Π° ΡΡΡΠ»ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΈΠ΄ΡΠΈ ΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΊ Π΄Π΅ΡΡΠΌ ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΎΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΡΠ·Π»Π° ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ.
Π‘Π»Π°Π±ΡΠ΅ ΡΡΡΠ»ΠΊΠΈΠΠ»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±Π΅Π· ΡΠ²ΠΎΠΉΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠ»ΠΊΠ°ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ, Π² 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'
# ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅ΡΠΎΠ΄Π° (Π±Π΅Π· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ)