我的問題的簡單示例:
class AbstractService:
subscribers = []
@classmethod
def subscribe(cls, service):
service.subscribers.append(cls)
@classmethod
@abstractmethod
def notify(cls, payload):
raise NotImplementedError(f"{cls.__name__} not implemented notify()")
class ServiceA(AbstractService):
@classmethod
def notify(cls, payload):
pass
class ServiceB(AbstractService):
@classmethod
def notify(cls, payload):
pass
ServiceB.subscribe(ServiceA)
ServiceA.notify({'message': 'hello'})
問題是這個實體中的所有服務都將共享訂閱者,因此我的解決方案是創建一個回傳抽象服務的函式:
def get_abstract_service():
class AbstractService:
subscribers = []
@classmethod
def subscribe(cls, service):
service.subscribers.append(cls)
@classmethod
@abstractmethod
def notify(cls, payload):
raise NotImplementedError(f"{cls.__name__} not implemented notify()")
return AbstractService
class ServiceA(get_abstract_service()):
@classmethod
def notify(cls, payload):
pass
class ServiceB(get_abstract_service()):
@classmethod
def notify(cls, payload):
pass
ServiceB.subscribe(ServiceA)
ServiceA.notify({'message': 'hello'})
這現在起作用了,因為訂閱者對于每個繼承抽象服務的類都是唯一的。
問題
這對python是否正確,或者如果是這樣,模式是否錯誤在這種情況下是什么標準
如果我的解決方案正確,我如何處理 AbstractService 的輸入(對于任何需要將該型別傳遞給它的函式)
uj5u.com熱心網友回復:
我會這樣處理它:
from __future__ import annotations
class AbstractService:
subscribers: list[AbstractService]
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
cls.subscribers = []
它在創建后為每個類設定一個新subscribers實體。
編輯:此外,這也可以通過使用為您處理打字from __future__ import annotations
例如
class C:
def f(self) -> C:
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446640.html
標籤:Python python-3.x 遗产 抽象类
