2017-01-29 14 views
2

의 구현을 등록 할 때오류 시도 내가 가진 다음 수업 zope.interface

@implementer(ISocial) 
class SocialVKSelenium: 
    pass 

을 그리고 조프 레지스트리에 추가 할 때 내가 가진

gsm = getGlobalSiteManager() 
gsm.registerAdapter(SocialVKSelenium) 

: TypeError: The adapter factory doesn't have a __component_adapts__ attribute and no required specifications were specified

거기에 어댑터 (IOther)를 추가하면 예상대로 등록이 작동하지만 그렇지 않은 경우는 없습니다. 왜 그렇게됩니까?

+0

"순수한"Zope 3 애플리케이션입니까? 일반적으로 Zope의 상단에 만들어진 것은 레지스트리를 제공합니다. –

+0

@MikkoOhtamaa 분리 된 구성 요소에 대해 일부 레지스트리를 사용하는 방법을 찾고 있습니다. 하지만 내가 뭔가 잘못하고 있다고 생각합니다. 저는 zca 개념에 대한 오해가있었습니다. – Infernion

+0

적응할 대상에 대해 명확한 아이디어가 필요합니다 (예 : 적응되는 문맥 객체는 무엇인가? 다양한 종류의 오브젝트를 적용 할 수있는 어댑터가 필요한 경우 다양한 방법으로 어댑터를 구현할 수 있지만 어댑터의 가장 간단한 경우에는/adapts로부터의 소스 인터페이스와 목적지 인터페이스 (to/implements)가 있습니다. . – sdupton

답변

2

클래스 또는 레지스트리에 컨텍스트를 제공해야합니다.

당신이 문제 세트 전체를 의사 소통하지 않는다고 생각합니다. 어댑터는 인터페이스의 객체를 조정하고 다른 인터페이스를 제공하는 구성 요소입니다. 귀하의 예제는 컨텍스트가 적응되는 것, 즉 클래스에 의해 어댑터 오브젝트를 구성하는 데 어떤 종류의 오브젝트가 적용되는지 지정하지 못합니다.

예를 들어,이 작품을 잘 :이의 장식 (구현/어댑터) 구문을 사용할 수 있지만

from zope.interface import Interface, implements 
from zope.component import getGlobalSiteManager, adapts 


class IWeight(Interface): 
    pass 


class IVolume(Interface): 
    pass 

class WeightToVolume(object): 
    implements(IVolume) 
    adapts(IWeight) 
    #... 


gsm = getGlobalSiteManager() 
gsm.registerAdapter(WeightToVolume) 

, 규칙에 따라, 구현의 사용/적응이 클래스입니다 어댑터 공장에 바람직하다, 기능이 아닙니다.

어댑터가 클래스 또는 팩토리 기능 자체에 적용되는 것을 선언하지 않으면 최소한 레지스트리에 알려야합니다.

물론
gsm.registerAdapter(MyAdapterClassHere, required=(Interface,)) 

는,이 예는 위의 당신이 필요한 이유를 알고하지 않는 한 사용하지 않는 것이 좋습니다 어떤 상황을 적응 주장 어댑터입니다 : 같은 광범위한 경우,이 보일 수 있습니다.

+0

깨끗한 설명에 감사드립니다. 이제 개념을 더 이해하게되었습니다. class scope 내부에 __metaclass__가 없기 때문에,'implements' 함수는 파이썬 3에서는 작동하지 않습니다. – Infernion