python - 类实例化以及抽象/静态类的变量共享

标签 python python-3.x inheritance abstract-class

我的问题的简单示例:

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'})

现在这可以工作了,因为订阅者对于继承抽象服务的每个类都是唯一的。

问题

  1. 这对于 python 来说是正确的吗?或者模式是否错误,如果是的话,会是什么? 这种情况下的常态

  2. 如果我的解决方案正确,我该如何处理 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/

相关文章:

python - 可移植Python/IPython

python - 验证 Python 中的字符串中存在多少对括号

c++ - 返回不同类型的变量

python - 在 Tensorflow 中,变量和张量有什么区别?

python - 使用 Selenium 从没有 ID 或类的列表中抓取文本

python - 使用 Sqlite3 的数据库

c# - 如何避免类继承绕过?

python - 如何覆盖两层深度的类属性?

python - 为什么我可以在测试中访问 c​​ollections.abc,但不能在生产中访问?

python - 跟踪文件夹更改/Dropbox 更改