多个模块的单例类继承不起作用

问题描述 投票:0回答:1

我正在尝试创建多个共享同一个单例父类的子类。同时,正在为每个孩子初始化单例父类,缺少单例提议。这是一个单独的包,其中每个子项位于每个模块中,最终在 init 中初始化。

我认为问题是由于父类被导入到每个子模块中。 贝娄是单例类。

#server.py
class DeviceI_O:


    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(DeviceI_O, cls).__new__(cls)
            cls._instance.__initialized = False
        return cls._instance

    def __init__(self):
        if self.__initialized:
            return
        self.__initialized = True
        print('init once')

包的init


from .trap_controller import TrapControler
from .flowcell_stage import FlowCell
from .camera_controller import CameraController
from .calibration import Calibration
from .server import DeviceI_O


pm = TrapControler('pm')
aod = TrapControler('aod')
flowcell = FlowCell()
calibrate = Calibration() 
cameraController = CameraController()

现在每个孩子如下:

# example flowcell
from .server import DeviceI_O

class FlowCell(DeviceI_O):

    def __init__(self):

        super().__init__()
        self.DAQ=40 #Hz
#example trapcontrol

from .server import DeviceI_O


class TrapControler(DeviceI_O):

    def __init__(self, name):
        super().__init__()
        self._name = name


当我初始化包时,我得到了四次(“初始化一次”)。 我怎样才能做到这一点,这样我只将服务器作为单例初始化一次。

python module package singleton
1个回答
0
投票

您混淆了

inheritance
reference
的概念。

像您一样将您的孩子定义为继承类,可以让您的每个孩子都具有与您的父类相同的行为。 您想要的是创建一个您拥有的每个孩子都通用的实例(即类的真实版本)。

所以你所做的(在其结构中)相当于:

class Parent:
    def __init__(self, name): #name is dummy variable
        print("init once")
        self.name = name

    def a_method(self):
        #Do something
        pass

class Child(Parent):
    def __init__(self, name):
        self.super(name)
        #At that point self.name is equal to name
        #And the Child have also "a_method" from Parent

c1 = Child('Alice')
c2 = Child('Bob')
c3 = Child('Charlie')

输出将是:

init once
init once
init once

你想要的是,对于每个孩子,将父母作为参数传递:

class Parent:
    def __init__(self, name):
        print("init once")
        self.name = name

    def a_method(self):
        #Do something
        pass

class Child: #Note that the Child inherits from nothing
    def __init__(self, name, parent):
        self.name = name
        self.parent = parent

parent = Parent("John")
c1 = Child("Alice", parent)
c2 = Child("Bob", parent)

输出将是:

init once

如果您确实需要在子定义中的某个时刻从父级调用方法,您可以编写:

#In class Child:
def child_method(self)
    self.parent.a_method()

现在您只需实例化一次父级并从此实例创建您想要的每个子级。

注意:我一直使用你的“孩子/父母”词汇,尽管在将父母的参考信息传递给孩子的情况下它们是滥用的,但通信保持完整

© www.soinside.com 2019 - 2024. All rights reserved.