child class 作为单例

child class as singleton

在python中,我想设计两个classes :

  1. classA里面会有一套方法。
  2. class B 将拥有 A 的所有方法并且是一个单例。

我是这样写的:

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class A:
    def __init__(self, toto):
        self.toto = toto

    def another_method(self):
        ...


class B(A, metaclass=Singleton):
    pass

这是定义 A 和 B 的正确方法吗?

确实是一种可能的方式,不是唯一的方式。

当元类将被重复使用 类 次时,使用元类是有意义的。在这里你也可以使用 A:

中的 __new__ 方法
class A:
    _instances = {}
    def __new__(cls, toto):
        if cls is A:
            obj = object.__new__(cls)
            obj._do_init(toto)
        elif cls not in A._instances:
            A._instances[cls] = object.__new__(cls)
            A._instances[cls]._do_init(toto)
        return A._instances[cls]

    # initialization is moved from the special __init__ method to
    # a private one to prevent subsequent "creations" to change the
    # initial value of the singleton
    def _do_init(self, toto):
        self.toto = toto

class B(A):
    pass