문제

계정과 운영자의 두 가지 수업이 있습니다. 계정에는 운영자 목록이 포함되어 있습니다. 이제 운영자 (목록 내)가 메시지를받을 때마다 계정 개체에 일부 비즈니스 로직을 수행하도록 알리고 싶습니다.

이를 달성하는 방법에 대한 세 가지 대안을 생각합니다.

1) 연산자 내에서 컨테이너 [계정] 객체에 대한 참조를 고정하고 직접 호출 방법을 호출하십시오. 원형 참조로 인해 절대적으로 좋지는 않습니다.

2) 이벤트 사용. 내가 아는 한, 파이썬에는 내장 이벤트 처리 메커니즘이 없습니다. 따라서 이것은 구현하기가 약간 까다 롭습니다.

3) 연산자에게 직접 메시지를 보내지 마십시오. 대신, 내부적으로 핸들러 운영자 만 계정 만 운영합니다. 이 경우 운영자에 대한 참조를 전달할 수 없기 때문에 이것은 약간 제한적입니다.

건축 적 관점에서 어떤 접근법이 가장 유리한 지 궁금합니다. 일반적 으로이 작업을 어떻게 처리합니까?

파이썬에서 스 니펫을 지적 할 수 있다면 좋을 것입니다.

도움이 되었습니까?

해결책

당신은 이것을 지나치게 생각하고 있습니다. 진지하게. 파이썬은 C ++가 아닙니다. 귀하의 우려는 파이썬에서 문제가되지 않습니다. 문제 영역에서 의미가있는 것을 작성하십시오.

"원형 참조 때문에 절대적으로 좋지는 않습니다."

왜 안 돼? 원형은 여기서 전혀 관련이 없습니다. 양방향 관계는 위대한 것입니다. 그것을 써. 파이썬 쓰레기는 당신의 생각없이 그들을 잘 모으고 있습니다.

상호 (조류) 관계에서 어떤 문제가 있습니까?

"... 내부적으로 핸들러 운영자 만 작동합니다.이 경우 운영자에 대한 참조를 전달할 수 없기 때문에 이것은 약간 제한적입니다."

뭐? 연산자는 파이썬 객체이며 원하는 모든 것을 통과합니다. 모든 파이썬 객체는 (사실상) 참조이며 땀을 흘리지 마십시오.

조작 연산자 객체에서 어떤 문제가 있습니까?

다른 팁

관찰자 패턴에 대한 "한 크기에 맞는"솔루션은 없습니다. 그러나 일반적으로 이해 당사자가 특정 이벤트에 등록하고 이러한 이벤트가 발생할 때마다 게시 할 수있는 EventManager 객체를 정의하는 것이 좋습니다. 단순히 종속성이 적습니다.

테스트 중 또는 일반적인 OO 관점 (글로벌 변수)에서 문제가 될 수있는 Global EventManager 인스턴스를 사용해야합니다. 나는 당신의 코드를 혼란시키기 때문에 이벤트 관리자를 항상 전달하는 것에 대해 강력히 권고합니다.

내 코드에서 이벤트 등록의 "키"는 이벤트 클래스입니다. EventManager는 사전 (이벤트 클래스 -> 관찰자 목록)을 사용하여 어떤 이벤트가 어디로 가는지 알 수 있습니다. 알림 코드에서 사용할 수 있습니다 dict.get(event.__class__, ()) 청취자를 찾기 위해.

나는 이것을 위해 이벤트 처리를 사용하겠습니다. 당신은 직접 구현할 필요가 없습니다 - 나는 사용합니다 Pydispatcher 이런 종류의 이벤트 처리를 위해서는 항상 매우 잘 작동합니다 (원형 참조 문제를 피하기 위해 내부적으로 약한 참조를 사용합니다).

또한 GUI 프레임 워크를 사용하는 경우 이미 연결할 수있는 이벤트 프레임 워크가있을 수 있습니다. pyqt 신호와 슬롯이 있습니다.

>>> class Account(object):
...     def notify(self):
...         print "Account notified"
...
>>> class Operator(object):
...     def __init__(self, notifier):
...         self.notifier = notifier
...
>>> A = Account()
>>> O = Operator(A.notify)
>>> O.notifier()
Account notified
>>> import gc
>>> gc.garbage
[]
>>> del A
>>> del O
>>> gc.garbage
[]

인스턴스 방법에 대해 알지 못하는 한 가지는 DOT 구문을 사용할 때 조회 할 때 묶인다는 것입니다. 다시 말해서 A.notify 알림의 자체 매개 변수를 A에 자동으로 바인딩합니다. 그런 다음 수집 할 수없는 쓰레기를 만들지 않고이 기능에 대한 참조를 보유 할 수 있습니다.

마지막으로 항상 사용할 수 있습니다 카마 엘리아 이런 유형의 일에 대해.

웹 전체에 관찰자 패턴 스 니펫이 있습니다. 신뢰할 수있는 코드의 좋은 소스는 활성 상태입니다.

http://code.activestate.com/recipes/131499/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top