擅长:python、mysql、java
<p>在模块中创建一个单独的实例是很好的。使用全局变量没有错(除非它们不合适,但这适用于任何语言特性)。唯一的潜在缺点是如果不使用它而导入该模块并浪费初始化该类的资源。除非您的类在创建时做了一些非常重要的事情(我对此非常怀疑),否则这种影响可以忽略不计。我唯一的建议就是调整你的名字。你的类应该以下划线开头,这样模块的用户就知道不要碰它,你的实例应该是小写的。你使用的方法不会产生任何不良副作用。在</p>
<p>没有人说你必须把所有的类放在它们自己的文件中,或者说你必须使用所有的类。也许一个包含函数的别名模块和模块全局参数中的“private”状态对您更有意义。由于您不使用对象系统来获取具有独立状态的多个实例,所以创建类的唯一原因是如果您喜欢这样组织代码和API。这里最重要的是,您对代码的组织方式和模块的使用方式感到满意。过多地使用面向对象的技术比使用太少的imo更容易混淆用户。在</p>
<p>有很多其他的方法来处理单例。这是我第一次听说“博格模式”,对我来说,这听起来既浪费又愚蠢,但我想至少在技术上是可行的,浪费至少可以忽略不计。您可以编写一个函数,在第一次调用一个类时实例化它,将它存储在一个全局中,并在随后的调用中返回该全局(但是,您必须担心线程化,这并不是您已经在做的问题)。您可以创建一个类,它的<code>__init__</code>方法引发TypeError,这样它就不能被实例化了,并且可以使用classmethods或staticmethods执行所有操作,保持类本身所需的所有状态。甚至可以创建一个每次都返回相同实例的类。所有这些的结果是,从模块中获取一个对象,然后在代码中使用它,之后使用它的方式看起来也一样。在</p>
<p>我认为你应该在你的一个模块中内联实例化你的类,就像你发布的代码一样,因为它是有效的,这是一个通用的模式,是合理的,对你来说是有意义的。在</p>
<p>没有理由删除已导入的模块。你什么也省不了。一旦导入,模块就永远存在(除非您积极地做一些奇怪的事情来消除它),全局变量并不是您需要保存的宝贵资源。在</p>
<p>只要使用相对名称(即别名而不是root.tools.aliases). 循环依赖是一个真正的问题,所以要小心。只要您的模块只导入树中更深层次的内容,并且您认为是“较低级别”(意味着这些较低级别的模块不会导入可能正在使用它们的较高级别的内容),您就应该没事了。我警告不要在<code>__init__.py,</code>中放置任何实质性的代码,但是我认为如果您希望实例存在的话,实例化类是可以的。在</p>