Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
zope.interface / docs / _build / doctrees / human.ru.doctree
Size: Mime:
€cdocutils.nodes
document
q)q}q(UtagnameqUdocumentqUreporterqNU
attributesq}q(Udupnamesq	]Ubackrefsq
]UsourceX?/home/tseaver/projects/Zope/Z3/zope.interface/docs/human.ru.rstqUidsq]Uclassesq
]Unamesq]uUparse_messagesq]qU
decorationqNU	citationsq]qU	rawsourceqUU	nametypesq}qX<использование реестра адаптеровqNsUsettingsq(cdocutils.frontend
Values
qoq}q(Upep_referencesqNUoutput_encoding_error_handlerqUstrictqU
halt_levelqKU
source_urlq NU
dump_settingsq!NUdoctitle_xformq"‰Udump_pseudo_xmlq#NU	tab_widthq$KU	id_prefixq%UUtitleq&NUembed_stylesheetq'‰U
docinfo_xformq(KUfootnote_backlinksq)KUerror_encodingq*UUTF-8q+Uauto_id_prefixq,Uidq-U
language_codeq.Uenq/U	datestampq0NUdump_transformsq1NUoutput_encodingq2Uutf-8q3Uexit_status_levelq4KUstrict_visitorq5NU_disable_configq6NUfile_insertion_enabledq7ˆU	tracebackq8ˆUrecord_dependenciesq9NUstrip_commentsq:NUdebugq;NU	generatorq<NUgettext_compactq=ˆUenvq>NU
strip_classesq?NUpep_file_url_templateq@Upep-%04dqAUinput_encoding_error_handlerqBhUexpose_internalsqCNUrfc_referencesqDNU
toc_backlinksqEUentryqFUtrim_footnote_reference_spaceqG‰U_sourceqHhUwarning_streamqINUinput_encodingqJU	utf-8-sigqKUsectsubtitle_xformqL‰Usource_linkqMNUconfigqNNU
sectnum_xformqOKUerror_encoding_error_handlerqPUbackslashreplaceqQU
_config_filesqR]Udump_internalsqSNUsmart_quotesqT‰Ucloak_email_addressesqUˆUraw_enabledqVKUstrip_elements_with_classesqWNUpep_base_urlqXU https://www.python.org/dev/peps/qYUreport_levelqZKUrfc_base_urlq[Uhttps://tools.ietf.org/html/q\U_destinationq]NUsyntax_highlightq^Ulongq_ubUautofootnote_refsq`]qaU
footnote_refsqb}qcUid_startqdKU
citation_refsqe}qfUsymbol_footnote_refsqg]qhUtransform_messagesqi]qjU	footnotesqk]qlUnameidsqm}qnhUid1qosUrefnamesqp}qqUtransformerqrNUidsqs}qthocdocutils.nodes
section
qu)qv}qw(hhhUsectionqxh}qy(h
]h	]h]qzhah]q{hoah
]uUlineq|KUsourceq}hhUUparentq~hUchildrenq]q€(cdocutils.nodes
title
q)q‚}qƒ(hhhh&h}q„(h
]h	]h]h]h
]uh|Kh}hhX<Использование реестра адаптеровq…h~hvh]q†cdocutils.nodes
Text
q‡X<Использование реестра адаптеровqˆ…q‰}qŠ(hh…h~h‚ubaubcdocutils.nodes
paragraph
q‹)qŒ}q(hhhU	paragraphqŽh}q(h
]h	]h]h]h
]uh|Kh}hhXyДанный документ содержит небольшую демонстрацию пакета ``zope.interface`` и его
реестра адаптеров. Документ рассчитывался как конкретный, но более узкий пример
того как использовать интерфейсы и адаптеры вне Zope 3.h~hvh]q(h‡XhДанный документ содержит небольшую демонстрацию пакета q‘…q’}q“(hXhДанный документ содержит небольшую демонстрацию пакета h~hŒubcdocutils.nodes
literal
q”)q•}q–(hX``zope.interface``hUliteralq—h}q˜(h
]h	]h]h]h
]uh~hŒh]q™h‡Xzope.interfaceqš…q›}qœ(hUh~h•ubaubh‡Xÿ и его
реестра адаптеров. Документ рассчитывался как конкретный, но более узкий пример
того как использовать интерфейсы и адаптеры вне Zope 3.q…qž}qŸ(hXÿ и его
реестра адаптеров. Документ рассчитывался как конкретный, но более узкий пример
того как использовать интерфейсы и адаптеры вне Zope 3.h~hŒubeubh‹)q }q¡(hhhhŽh}q¢(h
]h	]h]h]h
]uh|K	h}hhX‚Сначала нам необходимо импортировать пакет для работы с интерфейсами::q£h~hvh]q¤h‡XСначала нам необходимо импортировать пакет для работы с интерфейсами:q¥…q¦}q§(hXСначала нам необходимо импортировать пакет для работы с интерфейсами:h~h ubaubcdocutils.nodes
literal_block
q¨)q©}qª(hhhU
literal_blockq«h}q¬(h	]h
]U	xml:spaceq­Upreserveq®h
]h]h]uh|Kh}hhX>>> import zope.interfaceh~hvh]q¯h‡X>>> import zope.interfaceq°…q±}q²(hUh~h©ubaubh‹)q³}q´(hhhhŽh}qµ(h
]h	]h]h]h
]uh|K
h}hhX=Теперь мы разработаем интерфейс для нашего объекта - простого файла. Наш файл
будет содержать всего один атрибут - body, в котором фактически будет сохранено
содержимое файла::h~hvh]q¶h‡X<Теперь мы разработаем интерфейс для нашего объекта - простого файла. Наш файл
будет содержать всего один атрибут - body, в котором фактически будет сохранено
содержимое файла:q·…q¸}q¹(hX<Теперь мы разработаем интерфейс для нашего объекта - простого файла. Наш файл
будет содержать всего один атрибут - body, в котором фактически будет сохранено
содержимое файла:h~h³ubaubh¨)qº}q»(hhhh«h}q¼(h	]h
]h­h®h
]h]h]uh|Kh}hhX>>> class IFile(zope.interface.Interface):
...
...     body = zope.interface.Attribute(u'Содержимое файла.')
...h~hvh]q½h‡X>>> class IFile(zope.interface.Interface):
...
...     body = zope.interface.Attribute(u'Содержимое файла.')
...q¾…q¿}qÀ(hUh~hºubaubh‹)qÁ}qÂ(hhhhŽh}qÃ(h
]h	]h]h]h
]uh|Kh}hhXДля статистики нам часто необходимо знать размер файла. Но было бы несколько
топорно реализовывать определение размера прямо для объекта файла, т.к. размер
больше относится к мета-данным. Таким образом мы создаем еще один интерфейс для
представления размера какого-либо объекта::h~hvh]qÄh‡XÿДля статистики нам часто необходимо знать размер файла. Но было бы несколько
топорно реализовывать определение размера прямо для объекта файла, т.к. размер
больше относится к мета-данным. Таким образом мы создаем еще один интерфейс для
представления размера какого-либо объекта:qҁqÆ}qÇ(hXÿДля статистики нам часто необходимо знать размер файла. Но было бы несколько
топорно реализовывать определение размера прямо для объекта файла, т.к. размер
больше относится к мета-данным. Таким образом мы создаем еще один интерфейс для
представления размера какого-либо объекта:h~hÁubaubh¨)qÈ}qÉ(hhhh«h}qÊ(h	]h
]h­h®h
]h]h]uh|Kh}hhXu>>> class ISize(zope.interface.Interface):
...
...     def getSize():
...         'Return the size of an object.'
...h~hvh]qËh‡Xu>>> class ISize(zope.interface.Interface):
...
...     def getSize():
...         'Return the size of an object.'
...q̅qÍ}qÎ(hUh~hÈubaubh‹)qÏ}qÐ(hhhhŽh}qÑ(h
]h	]h]h]h
]uh|K!h}hhX Теперь мы должны создать класс реализующий наш файл. Необходимо что бы наш
объект хранил информацию о том, что он реализует интерфейс `IFile`. Мы также
создаем атрибут с содержимым файла по умолчанию (для упрощения нашего
примера)::h~hvh]qÒ(h‡XõТеперь мы должны создать класс реализующий наш файл. Необходимо что бы наш
объект хранил информацию о том, что он реализует интерфейс qӅqÔ}qÕ(hXõТеперь мы должны создать класс реализующий наш файл. Необходимо что бы наш
объект хранил информацию о том, что он реализует интерфейс h~hÏubcdocutils.nodes
title_reference
qÖ)q×}qØ(hX`IFile`hUtitle_referenceqÙh}qÚ(h
]h	]h]h]h
]uh~hÏh]qÛh‡XIFileq܅qÝ}qÞ(hUh~h×ubaubh‡X£. Мы также
создаем атрибут с содержимым файла по умолчанию (для упрощения нашего
примера):q߅qà}qá(hX£. Мы также
создаем атрибут с содержимым файла по умолчанию (для упрощения нашего
примера):h~hÏubeubh¨)qâ}qã(hhhh«h}qä(h	]h
]h­h®h
]h]h]uh|K&h}hhXc>>> class File(object):
...
...      zope.interface.implements(IFile)
...      body = 'foo bar'
...h~hvh]qåh‡Xc>>> class File(object):
...
...      zope.interface.implements(IFile)
...      body = 'foo bar'
...q慁qç}qè(hUh~hâubaubh‹)qé}qê(hhhhŽh}që(h
]h	]h]h]h
]uh|K,h}hhX'Дальше мы создаем адаптер, который будет предоставлять интерфейс `ISize`
получая любой объект предоставляющий интерфейс `IFile`. По соглашению мы
используем атрибут `__used_for__` для указания интерфейса который как мы
ожидаем предоставляет адаптируемый объект, `IFile` в нашем случае. На самом
деле этот атрибут используется только для документирования. В случае если
адаптер используется для нескольких интерфейсов можно указать их все в виде
кортежа.h~hvh]qì(h‡XyДальше мы создаем адаптер, который будет предоставлять интерфейс q텁qî}qï(hXyДальше мы создаем адаптер, который будет предоставлять интерфейс h~héubhÖ)qð}qñ(hX`ISize`hhÙh}qò(h
]h	]h]h]h
]uh~héh]qóh‡XISizeqô…qõ}qö(hUh~hðubaubh‡XZ
получая любой объект предоставляющий интерфейс q÷…qø}qù(hXZ
получая любой объект предоставляющий интерфейс h~héubhÖ)qú}qû(hX`IFile`hhÙh}qü(h
]h	]h]h]h
]uh~héh]qýh‡XIFileqþ…qÿ}r(hUh~húubaubh‡XE. По соглашению мы
используем атрибут r…r}r(hXE. По соглашению мы
используем атрибут h~héubhÖ)r}r(hX`__used_for__`hhÙh}r(h
]h	]h]h]h
]uh~héh]rh‡X__used_for__r…r	}r
(hUh~jubaubh‡Xš для указания интерфейса который как мы
ожидаем предоставляет адаптируемый объект, r…r}r
(hXš для указания интерфейса который как мы
ожидаем предоставляет адаптируемый объект, h~héubhÖ)r}r(hX`IFile`hhÙh}r(h
]h	]h]h]h
]uh~héh]rh‡XIFiler…r}r(hUh~jubaubh‡XR в нашем случае. На самом
деле этот атрибут используется только для документирования. В случае если
адаптер используется для нескольких интерфейсов можно указать их все в виде
кортежа.r…r}r(hXR в нашем случае. На самом
деле этот атрибут используется только для документирования. В случае если
адаптер используется для нескольких интерфейсов можно указать их все в виде
кортежа.h~héubeubh‹)r}r(hhhhŽh}r(h
]h	]h]h]h
]uh|K4h}hhX	Опять же по соглашению конструктор адаптера получает один аргумент - context
(контекст). В нашем случае контекст - это экземпляр `IFile` (объект,
предоставляющий `IFile`) который используется для получения из него размера.
Так же по соглашению контекст сохраняется а адаптере в атрибуте с именем
`context`. Twisted комьюнити ссылается на контекст как на объект `original`.
Таким образом можно также дать аргументу любое подходящее имя, например
`file`::h~hvh]r(h‡XãОпять же по соглашению конструктор адаптера получает один аргумент - context
(контекст). В нашем случае контекст - это экземпляр r…r}r(hXãОпять же по соглашению конструктор адаптера получает один аргумент - context
(контекст). В нашем случае контекст - это экземпляр h~jubhÖ)r}r (hX`IFile`hhÙh}r!(h
]h	]h]h]h
]uh~jh]r"h‡XIFiler#…r$}r%(hUh~jubaubh‡X/ (объект,
предоставляющий r&…r'}r((hX/ (объект,
предоставляющий h~jubhÖ)r)}r*(hX`IFile`hhÙh}r+(h
]h	]h]h]h
]uh~jh]r,h‡XIFiler-…r.}r/(hUh~j)ubaubh‡Xè) который используется для получения из него размера.
Так же по соглашению контекст сохраняется а адаптере в атрибуте с именем
r0…r1}r2(hXè) который используется для получения из него размера.
Так же по соглашению контекст сохраняется а адаптере в атрибуте с именем
h~jubhÖ)r3}r4(hX	`context`hhÙh}r5(h
]h	]h]h]h
]uh~jh]r6h‡Xcontextr7…r8}r9(hUh~j3ubaubh‡X_. Twisted комьюнити ссылается на контекст как на объект r:…r;}r<(hX_. Twisted комьюнити ссылается на контекст как на объект h~jubhÖ)r=}r>(hX
`original`hhÙh}r?(h
]h	]h]h]h
]uh~jh]r@h‡XoriginalrA…rB}rC(hUh~j=ubaubh‡X‡.
Таким образом можно также дать аргументу любое подходящее имя, например
rD…rE}rF(hX‡.
Таким образом можно также дать аргументу любое подходящее имя, например
h~jubhÖ)rG}rH(hX`file`hhÙh}rI(h
]h	]h]h]h
]uh~jh]rJh‡XfilerK…rL}rM(hUh~jGubaubh‡X:…rN}rO(hX:h~jubeubh¨)rP}rQ(hhhh«h}rR(h	]h
]h­h®h
]h]h]uh|K<h}hhX>>> class FileSize(object):
...
...      zope.interface.implements(ISize)
...      __used_for__ = IFile
...
...      def __init__(self, context):
...          self.context = context
...
...      def getSize(self):
...          return len(self.context.body)
...h~hvh]rSh‡X>>> class FileSize(object):
...
...      zope.interface.implements(ISize)
...      __used_for__ = IFile
...
...      def __init__(self, context):
...          self.context = context
...
...      def getSize(self):
...          return len(self.context.body)
...rT…rU}rV(hUh~jPubaubh‹)rW}rX(hhhhŽh}rY(h
]h	]h]h]h
]uh|KHh}hhXñТеперь когда мы написали наш адаптер мы должны зарегистрировать его в реестре
адаптеров, что бы его можно было запросить когда он понадобится. Здесь нет
какого-либо глобального реестра адаптеров, таким образом мы должны
самостоятельно создать для нашего примера реестр::h~hvh]rZh‡XðТеперь когда мы написали наш адаптер мы должны зарегистрировать его в реестре
адаптеров, что бы его можно было запросить когда он понадобится. Здесь нет
какого-либо глобального реестра адаптеров, таким образом мы должны
самостоятельно создать для нашего примера реестр:r[…r\}r](hXðТеперь когда мы написали наш адаптер мы должны зарегистрировать его в реестре
адаптеров, что бы его можно было запросить когда он понадобится. Здесь нет
какого-либо глобального реестра адаптеров, таким образом мы должны
самостоятельно создать для нашего примера реестр:h~jWubaubh¨)r^}r_(hhhh«h}r`(h	]h
]h­h®h
]h]h]uh|KMh}hhXW>>> from zope.interface.adapter import AdapterRegistry
>>> registry = AdapterRegistry()h~hvh]rah‡XW>>> from zope.interface.adapter import AdapterRegistry
>>> registry = AdapterRegistry()rb…rc}rd(hUh~j^ubaubh‹)re}rf(hhhhŽh}rg(h
]h	]h]h]h
]uh|KPh}hhXzРеестр содержит отображение того, что адаптер реализует на основе другого
интерфейса который предоставляет объект. Поэтому дальше мы регистрируем адаптер
который адаптирует интерфейс `IFile` к интерфейсу `ISize`. Первый аргумент к
методу `register()` реестра - это список адаптируемых интерфейсов. В нашем
случае мы имеем только один адаптируемый интерфейс - `IFile`. Список
интерфейсов имеет смысл для использования концепции мульти-адаптеров, которые
требуют нескольких оригинальных объектов для адаптации к новому интерфейсу. В
этой ситуации конструктор адаптера будет требовать новый аргумент для каждого
оригинального интерфейса.h~hvh]rh(h‡XVРеестр содержит отображение того, что адаптер реализует на основе другого
интерфейса который предоставляет объект. Поэтому дальше мы регистрируем адаптер
который адаптирует интерфейс ri…rj}rk(hXVРеестр содержит отображение того, что адаптер реализует на основе другого
интерфейса который предоставляет объект. Поэтому дальше мы регистрируем адаптер
который адаптирует интерфейс h~jeubhÖ)rl}rm(hX`IFile`hhÙh}rn(h
]h	]h]h]h
]uh~jeh]roh‡XIFilerp…rq}rr(hUh~jlubaubh‡X к интерфейсу rs…rt}ru(hX к интерфейсу h~jeubhÖ)rv}rw(hX`ISize`hhÙh}rx(h
]h	]h]h]h
]uh~jeh]ryh‡XISizerz…r{}r|(hUh~jvubaubh‡X0. Первый аргумент к
методу r}…r~}r(hX0. Первый аргумент к
методу h~jeubhÖ)r€}r(hX`register()`hhÙh}r‚(h
]h	]h]h]h
]uh~jeh]rƒh‡X
register()r„…r…}r†(hUh~j€ubaubh‡XÆ реестра - это список адаптируемых интерфейсов. В нашем
случае мы имеем только один адаптируемый интерфейс - r‡…rˆ}r‰(hXÆ реестра - это список адаптируемых интерфейсов. В нашем
случае мы имеем только один адаптируемый интерфейс - h~jeubhÖ)rŠ}r‹(hX`IFile`hhÙh}rŒ(h
]h	]h]h]h
]uh~jeh]rh‡XIFilerŽ…r}r(hUh~jŠubaubh‡Xô. Список
интерфейсов имеет смысл для использования концепции мульти-адаптеров, которые
требуют нескольких оригинальных объектов для адаптации к новому интерфейсу. В
этой ситуации конструктор адаптера будет требовать новый аргумент для каждого
оригинального интерфейса.r‘…r’}r“(hXô. Список
интерфейсов имеет смысл для использования концепции мульти-адаптеров, которые
требуют нескольких оригинальных объектов для адаптации к новому интерфейсу. В
этой ситуации конструктор адаптера будет требовать новый аргумент для каждого
оригинального интерфейса.h~jeubeubh‹)r”}r•(hhhhŽh}r–(h
]h	]h]h]h
]uh|KZh}hhXВторой аргумент метода `register()` - это интерфейс который предоставляет
адаптер, в нашем случае `ISize`. Третий аргумент - имя адаптера. Сейчас нам не
важно имя адаптера и мы передаем его как пустую строку. Обычно имена полезны
если используются адаптеры для одинакового набора интерфейсов, но в различных
ситуациях. Последний аргумент - это класс адаптера::h~hvh]r—(h‡X+Второй аргумент метода r˜…r™}rš(hX+Второй аргумент метода h~j”ubhÖ)r›}rœ(hX`register()`hhÙh}r(h
]h	]h]h]h
]uh~j”h]ržh‡X
register()rŸ…r }r¡(hUh~j›ubaubh‡Xr - это интерфейс который предоставляет
адаптер, в нашем случае r¢…r£}r¤(hXr - это интерфейс который предоставляет
адаптер, в нашем случае h~j”ubhÖ)r¥}r¦(hX`ISize`hhÙh}r§(h
]h	]h]h]h
]uh~j”h]r¨h‡XISizer©…rª}r«(hUh~j¥ubaubh‡XÎ. Третий аргумент - имя адаптера. Сейчас нам не
важно имя адаптера и мы передаем его как пустую строку. Обычно имена полезны
если используются адаптеры для одинакового набора интерфейсов, но в различных
ситуациях. Последний аргумент - это класс адаптера:r¬…r­}r®(hXÎ. Третий аргумент - имя адаптера. Сейчас нам не
важно имя адаптера и мы передаем его как пустую строку. Обычно имена полезны
если используются адаптеры для одинакового набора интерфейсов, но в различных
ситуациях. Последний аргумент - это класс адаптера:h~j”ubeubh¨)r¯}r°(hhhh«h}r±(h	]h
]h­h®h
]h]h]uh|K`h}hhX3>>> registry.register([IFile], ISize, '', FileSize)h~hvh]r²h‡X3>>> registry.register([IFile], ISize, '', FileSize)r³…r´}rµ(hUh~j¯ubaubh‹)r¶}r·(hhhhŽh}r¸(h
]h	]h]h]h
]uh|Kbh}hhXkТеперь мы можем использовать реестр для запроса адаптера::r¹h~hvh]rºh‡XjТеперь мы можем использовать реестр для запроса адаптера:r»…r¼}r½(hXjТеперь мы можем использовать реестр для запроса адаптера:h~j¶ubaubh¨)r¾}r¿(hhhh«h}rÀ(h	]h
]h­h®h
]h]h]uh|Kdh}hhXB>>> registry.lookup1(IFile, ISize, '')
<class '__main__.FileSize'>h~hvh]rÁh‡XB>>> registry.lookup1(IFile, ISize, '')
<class '__main__.FileSize'>rÂ…rÃ}rÄ(hUh~j¾ubaubh‹)rÅ}rÆ(hhhhŽh}rÇ(h
]h	]h]h]h
]uh|Kgh}hhXNПопробуем более практичный пример. Создадим экземпляр `File` и создадим адаптер
использующий запрос реестра. Затем мы увидим возвращает ли адаптер корректный
размер при вызове `getSize()`::h~hvh]rÈ(h‡XeПопробуем более практичный пример. Создадим экземпляр rÉ…rÊ}rË(hXeПопробуем более практичный пример. Создадим экземпляр h~jÅubhÖ)rÌ}rÍ(hX`File`hhÙh}rÎ(h
]h	]h]h]h
]uh~jÅh]rÏh‡XFilerÐ…rÑ}rÒ(hUh~jÌubaubh‡XÖ и создадим адаптер
использующий запрос реестра. Затем мы увидим возвращает ли адаптер корректный
размер при вызове rÓ…rÔ}rÕ(hXÖ и создадим адаптер
использующий запрос реестра. Затем мы увидим возвращает ли адаптер корректный
размер при вызове h~jÅubhÖ)rÖ}r×(hX`getSize()`hhÙh}rØ(h
]h	]h]h]h
]uh~jÅh]rÙh‡X	getSize()rÚ…rÛ}rÜ(hUh~jÖubaubh‡X:…rÝ}rÞ(hX:h~jÅubeubh¨)rß}rà(hhhh«h}rá(h	]h
]h­h®h
]h]h]uh|Kkh}hhXZ>>> file = File()
>>> size = registry.lookup1(IFile, ISize, '')(file)
>>> size.getSize()
7h~hvh]râh‡XZ>>> file = File()
>>> size = registry.lookup1(IFile, ISize, '')(file)
>>> size.getSize()
7rㅁrä}rå(hUh~jßubaubh‹)ræ}rç(hhhhŽh}rè(h
]h	]h]h]h
]uh|Kph}hhXНа самом деле это не очень практично, т.к. нам нужно самим передавать все
аргументы методу запроса. Существует некоторый синтаксический леденец который
позволяет нам получить экземпляр адаптера просто вызвав `ISize(file)`. Что бы
использовать эту функциональность нам понадобится добавить наш реестр к списку
adapter_hooks, который находится в модуле с адаптерами. Этот список хранит
коллекцию вызываемых объектов которые вызываются автоматически когда вызывается
IFoo(obj); их предназначение - найти адаптеры которые реализуют интерфейс для
определенного экземпляра контекста.h~hvh]ré(h‡X€На самом деле это не очень практично, т.к. нам нужно самим передавать все
аргументы методу запроса. Существует некоторый синтаксический леденец который
позволяет нам получить экземпляр адаптера просто вызвав rꅁrë}rì(hX€На самом деле это не очень практично, т.к. нам нужно самим передавать все
аргументы методу запроса. Существует некоторый синтаксический леденец который
позволяет нам получить экземпляр адаптера просто вызвав h~jæubhÖ)rí}rî(hX
`ISize(file)`hhÙh}rï(h
]h	]h]h]h
]uh~jæh]rðh‡XISize(file)rñ…rò}ró(hUh~jíubaubh‡X. Что бы
использовать эту функциональность нам понадобится добавить наш реестр к списку
adapter_hooks, который находится в модуле с адаптерами. Этот список хранит
коллекцию вызываемых объектов которые вызываются автоматически когда вызывается
IFoo(obj); их предназначение - найти адаптеры которые реализуют интерфейс для
определенного экземпляра контекста.rô…rõ}rö(hX. Что бы
использовать эту функциональность нам понадобится добавить наш реестр к списку
adapter_hooks, который находится в модуле с адаптерами. Этот список хранит
коллекцию вызываемых объектов которые вызываются автоматически когда вызывается
IFoo(obj); их предназначение - найти адаптеры которые реализуют интерфейс для
определенного экземпляра контекста.h~jæubeubh‹)r÷}rø(hhhhŽh}rù(h
]h	]h]h]h
]uh|Kyh}hhX_Необходимо реализовать свою собственную функцию для поиска адаптера; данный
пример описывает одну из простейших функций для использования с реестром, но
также можно реализовать поисковые функции которые, например, используют
кэширование, или адаптеры сохраняемые в базе. Функция поиска должна принимать
желаемый на выходе интерфейс (в нашем случае `ISize`) как первый аргумент и
контекст для адаптации (`file`) как второй. Функция должна вернуть адаптер,
т.е. экземпляр `FileSize`::h~hvh]rú(h‡X„Необходимо реализовать свою собственную функцию для поиска адаптера; данный
пример описывает одну из простейших функций для использования с реестром, но
также можно реализовать поисковые функции которые, например, используют
кэширование, или адаптеры сохраняемые в базе. Функция поиска должна принимать
желаемый на выходе интерфейс (в нашем случае rû…rü}rý(hX„Необходимо реализовать свою собственную функцию для поиска адаптера; данный
пример описывает одну из простейших функций для использования с реестром, но
также можно реализовать поисковые функции которые, например, используют
кэширование, или адаптеры сохраняемые в базе. Функция поиска должна принимать
желаемый на выходе интерфейс (в нашем случае h~j÷ubhÖ)rþ}rÿ(hX`ISize`hhÙh}r(h
]h	]h]h]h
]uh~j÷h]rh‡XISizer…r}r(hUh~jþubaubh‡XV) как первый аргумент и
контекст для адаптации (r…r}r(hXV) как первый аргумент и
контекст для адаптации (h~j÷ubhÖ)r}r	(hX`file`hhÙh}r
(h
]h	]h]h]h
]uh~j÷h]rh‡Xfiler…r
}r(hUh~jubaubh‡Xl) как второй. Функция должна вернуть адаптер,
т.е. экземпляр r…r}r(hXl) как второй. Функция должна вернуть адаптер,
т.е. экземпляр h~j÷ubhÖ)r}r(hX
`FileSize`hhÙh}r(h
]h	]h]h]h
]uh~j÷h]rh‡XFileSizer…r}r(hUh~jubaubh‡X:…r}r(hX:h~j÷ubeubh¨)r}r(hhhh«h}r(h	]h
]h­h®h
]h]h]uh|Kh}hhX¹>>> def hook(provided, object):
...     adapter = registry.lookup1(zope.interface.providedBy(object),
...                                provided, '')
...     return adapter(object)
...h~hvh]rh‡X¹>>> def hook(provided, object):
...     adapter = registry.lookup1(zope.interface.providedBy(object),
...                                provided, '')
...     return adapter(object)
...r…r }r!(hUh~jubaubh‹)r"}r#(hhhhŽh}r$(h
]h	]h]h]h
]uh|K‡h}hhXkТеперь мы просто добавляем нашу функцию к списку `adapter_hooks`::r%h~hvh]r&(h‡XZТеперь мы просто добавляем нашу функцию к списку r'…r(}r)(hXZТеперь мы просто добавляем нашу функцию к списку h~j"ubhÖ)r*}r+(hX`adapter_hooks`hhÙh}r,(h
]h	]h]h]h
]uh~j"h]r-h‡X
adapter_hooksr.…r/}r0(hUh~j*ubaubh‡X:…r1}r2(hX:h~j"ubeubh¨)r3}r4(hhhh«h}r5(h	]h
]h­h®h
]h]h]uh|K‰h}hhXU>>> from zope.interface.interface import adapter_hooks
>>> adapter_hooks.append(hook)h~hvh]r6h‡XU>>> from zope.interface.interface import adapter_hooks
>>> adapter_hooks.append(hook)r7…r8}r9(hUh~j3ubaubh‹)r:}r;(hhhhŽh}r<(h
]h	]h]h]h
]uh|KŒh}hhX’Как только функция зарегистрирована мы можем использовать желаемый синтаксис::r=h~hvh]r>h‡X‘Как только функция зарегистрирована мы можем использовать желаемый синтаксис:r?…r@}rA(hX‘Как только функция зарегистрирована мы можем использовать желаемый синтаксис:h~j:ubaubh¨)rB}rC(hhhh«h}rD(h	]h
]h­h®h
]h]h]uh|KŽh}hhX+>>> size = ISize(file)
>>> size.getSize()
7h~hvh]rEh‡X+>>> size = ISize(file)
>>> size.getSize()
7rF…rG}rH(hUh~jBubaubh‹)rI}rJ(hhhhŽh}rK(h
]h	]h]h]h
]uh|K’h}hhX©После нам нужно прибраться за собой, что бы другие получили чистый список
`adaper_hooks` после нас::h~hvh]rL(h‡X‡После нам нужно прибраться за собой, что бы другие получили чистый список
rM…rN}rO(hX‡После нам нужно прибраться за собой, что бы другие получили чистый список
h~jIubhÖ)rP}rQ(hX`adaper_hooks`hhÙh}rR(h
]h	]h]h]h
]uh~jIh]rSh‡Xadaper_hooksrT…rU}rV(hUh~jPubaubh‡X после нас:rW…rX}rY(hX после нас:h~jIubeubh¨)rZ}r[(hhhh«h}r\(h	]h
]h­h®h
]h]h]uh|K•h}hhX>>> adapter_hooks.remove(hook)h~hvh]r]h‡X>>> adapter_hooks.remove(hook)r^…r_}r`(hUh~jZubaubh‹)ra}rb(hhhhŽh}rc(h
]h	]h]h]h
]uh|K—h}hhXóЭто все. Здесь намеренно отложена дискуссия об именованных и мульти-адаптерах,
т.к. данный текст рассчитан как практическое и простое введение в интерфейсы и
адаптеры Zope 3. Для более подробной информации имеет смысл прочитать
`adapter.txt` из пакета `zope.interface`, что бы получить более формальное,
справочное и полное трактование пакета. Внимание: многие жаловались, что
`adapter.txt` приводит их мозг к расплавленному состоянию!h~hvh]rd(h‡XЭто все. Здесь намеренно отложена дискуссия об именованных и мульти-адаптерах,
т.к. данный текст рассчитан как практическое и простое введение в интерфейсы и
адаптеры Zope 3. Для более подробной информации имеет смысл прочитать
re…rf}rg(hXЭто все. Здесь намеренно отложена дискуссия об именованных и мульти-адаптерах,
т.к. данный текст рассчитан как практическое и простое введение в интерфейсы и
адаптеры Zope 3. Для более подробной информации имеет смысл прочитать
h~jaubhÖ)rh}ri(hX
`adapter.txt`hhÙh}rj(h
]h	]h]h]h
]uh~jah]rkh‡Xadapter.txtrl…rm}rn(hUh~jhubaubh‡X из пакета ro…rp}rq(hX из пакета h~jaubhÖ)rr}rs(hX`zope.interface`hhÙh}rt(h
]h	]h]h]h
]uh~jah]ruh‡Xzope.interfacerv…rw}rx(hUh~jrubaubh‡XÆ, что бы получить более формальное,
справочное и полное трактование пакета. Внимание: многие жаловались, что
ry…rz}r{(hXÆ, что бы получить более формальное,
справочное и полное трактование пакета. Внимание: многие жаловались, что
h~jaubhÖ)r|}r}(hX
`adapter.txt`hhÙh}r~(h
]h	]h]h]h
]uh~jah]rh‡Xadapter.txtr€…r}r‚(hUh~j|ubaubh‡XS приводит их мозг к расплавленному состоянию!rƒ…r„}r…(hXS приводит их мозг к расплавленному состоянию!h~jaubeubeubsUsymbol_footnotesr†]r‡hhUindirect_targetsrˆ]r‰Usubstitution_namesrŠ}r‹Ucurrent_linerŒNUsubstitution_defsr}rŽUsymbol_footnote_startrKUautofootnote_startrKU
autofootnotesr‘]r’h]r“hvaUcurrent_sourcer”NUrefidsr•}r–ub.