我正在尝试创建多个共享同一个单例父类的子类。同时,正在为每个孩子初始化单例父类,缺少单例提议。这是一个单独的包,其中每个子项位于每个模块中,最终在 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
当我初始化包时,我得到了四次(“初始化一次”)。 我怎样才能做到这一点,这样我只将服务器作为单例初始化一次。
您混淆了
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()
现在您只需实例化一次父级并从此实例创建您想要的每个子级。
注意:我一直使用你的“孩子/父母”词汇,尽管在将父母的参考信息传递给孩子的情况下它们是滥用的,但通信保持完整