我的问题的简单示例:
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 的输入 (对于任何需要将该类型传递给它的函数)
最佳答案
我会这样处理:
from __future__ import annotations
class AbstractService:
subscribers: list[AbstractService]
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
cls.subscribers = []
创建后,它会在每个类上设置一个新的subscribers
实例。
编辑:另外,这还可以通过使用 from __future__ import 注释
例如
class C:
def f(self) -> C:
...
关于python - 类实例化以及抽象/静态类的变量共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71515835/