Python 元类单例不工作

Python 元类单例不工作,python,singleton,metaclass,Python,Singleton,Metaclass,我最近尝试在我的项目中添加一个单例,但它的行为不像我想象的那样。 代码看起来有点像这样: main/main.py class main(metaclass=Singleton): def __init__(self): .... def Action(self): self.helper=otherclasses.other.other() if __name__ == "__main__": m = main() m.Acti

我最近尝试在我的项目中添加一个单例,但它的行为不像我想象的那样。 代码看起来有点像这样:

main/main.py

class main(metaclass=Singleton):
    def __init__(self):
        ....
    def Action(self):
        self.helper=otherclasses.other.other()

if __name__ == "__main__":
    m = main()
    m.Action()
class Singleton(type):
    _instance = None
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance 

    def Instance(cls, *args, **kwargs):
        return cls.__call__(*args, **kwargs)
class other():
     def __init__(self):
         ...
         self.main = Main.Instance()
         ...
main/metaclass/singleton.py

class main(metaclass=Singleton):
    def __init__(self):
        ....
    def Action(self):
        self.helper=otherclasses.other.other()

if __name__ == "__main__":
    m = main()
    m.Action()
class Singleton(type):
    _instance = None
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance 

    def Instance(cls, *args, **kwargs):
        return cls.__call__(*args, **kwargs)
class other():
     def __init__(self):
         ...
         self.main = Main.Instance()
         ...
main/otherclasses/other.py

class main(metaclass=Singleton):
    def __init__(self):
        ....
    def Action(self):
        self.helper=otherclasses.other.other()

if __name__ == "__main__":
    m = main()
    m.Action()
class Singleton(type):
    _instance = None
    def __init__(cls, name, bases, dict):
        super(Singleton, cls).__init__(name, bases, dict)

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instance 

    def Instance(cls, *args, **kwargs):
        return cls.__call__(*args, **kwargs)
class other():
     def __init__(self):
         ...
         self.main = Main.Instance()
         ...
所以,就我所理解的这个概念而言,我应该为子类获得相同的Main实例。然而我得到了一个全新的主要目标。 我很高兴能得到一些帮助!我错过了什么

提前谢谢。

解决了这个问题

我相信问题的原因是我通过“#python main.py”运行了程序。这样,因为main.py没有作为模块加载,当other.py调用“import main”时,它被重新加载,因此main重新初始化单例

将“Run”函数移动到另一个文件(#python Run.py)并从那里导入main.py,这样只需初始化一次Singleton(和main


谢谢大家:)

您是如何发现
Main.Instance()
返回一个新对象的?另外,为什么
subclass
不是子类,却被称为subclass?Main在它的init函数中打印日志,每当我从其他类调用它时,都会再次打印日志。子类也不被称为subclass,我将它命名为subclass只是为了这篇文章。错误名称选择,编辑将代码复制到此问题时,您必须更改了其他内容。我复制了它(将小写
singleton
改为大写),每次尝试实例化
main
或调用
main.Instance()
都会得到完全相同的对象。哦,我还正确地缩进了singleton.py“好吧,我已经修正了它并发布了答案。我想您已经适当地运行了它,而不是像我那样通过“main.py”,因此它对您有效。谢谢你的帮助
python main.py
作为一个模块运行
main.py
\uuuu main\uuu
模块。我不知道你是怎么做到的。您运行了
python main.py
other.py
imported main?这怎么可能?另外,不会重新加载任何模块,它们都是缓存的。通过读取sys.modules,我可以看到在运行
python main.py
时,我得到了
main
两次:一次来自
\uuuuu main\uuu
,另一次来自
main.py
。通过将它移到
python run.py
,我只得到了一次。关于
other.py
importingmain:我需要main使用
importlib.import\u模块(mod)
从某些源动态加载模块。这样,当导入main时,
other.py
不会重新导入自身并崩溃。