2012-07-26 99 views
5

我对Python提出这个问题,虽然它可能适用于大多数OOP语言。为“只有一个实例”创建一个Python类?

当我只希望在任何程序中使用的数据模型,只有一次,我可能要么使带班/静态方法的类和属性,或者只是做一个普通的类,一旦实例并只使用一个副本。在这种情况下,哪种方法更好,为什么?

使用python,我也可以编写一个模块并像使用类一样使用它。在这种情况下,哪种方式更好,为什么?

例如:我想有一个中央数据结构来访问/保存数据到文件。

模块方式:

data.py

attributes = something 
... 
def save(): 
... 

main.py

import data 
data.x = something 
... 
data.save() 

类的方法:

class Data: 
    attributes = something 
    @classmethod 
    def save(cls): 

Data.x = something 
Data.save() 

实例方式

class Data: 
    def save(self): 

data = Data() 
data.x = something 
data.save() 
+4

为什么downvote?这是一个合法的编程问题。 – darkfeline 2012-07-26 05:59:00

+1

单身python的搜索stackoverflow – warvariuc 2012-07-26 06:13:30

+2

修改后的问题好多了。我认为目前没有关闭(除了重复)。 – 2012-07-26 06:20:53

回答

5

的模块是指以包围共同结构的“命名空间”。但是真正在Python中,模块只是一个文件,你可以根据需要组织它们。有些人在一个模块中放置了很多功能。有些人把它们分散在软件包或子软件包上。取决于你想要的可重用性。如果一个模块具有大量的依赖关系,并且您希望重新使用一小部分,那么将它们分开是有意义的。

一个类允许你定义可以作为子类型继承的类型。他们还可以让你为每个类的实例定义一个状态。

当你的类没有状态,只有staticmethods/classmethods,机会是你不需要的类。你只需要功能。

此外,你不能创建一个模块,并像一个类一样使用它。一个模块不能有子类。它们在加载时只有一个基本模块init,然后是一个对象范围。

如果你所追求的是常数,这意味着他们的应用程序的生命定义一次,然后就创建了一堆原始的类型,如字符串,类型的字典和列表的constants.py模块。

+1

你可以使用一个模块有点像类(见我的例子),虽然它似乎有点hackish。我正在寻找状态和方法,但我只需要一个实例,所以我使用类或实例? – darkfeline 2012-07-26 06:02:02

+0

您仅在其范围内使用该模块。除了作为模块对象外,它不像一个类。任何对象都可以有属性。 – jdi 2012-07-26 06:03:53

+0

状态和方法有时会提示Singleton模式。虽然有些人认为他们是不好的风格。如果它具有状态和设置并且需要特定的功能,那么它可以是一个普通的类。你应该避免拥有积极修改全局变量的结构。常量通常只能读取 – jdi 2012-07-26 06:05:48

2

标准的随机模块实现具有良好的设计,可以显示模块级别的实例创建和使用,而不会强制任何用户使用单例。

例如,如果我称之为random.random()它使用Random类的一个隐藏的实例,其在进口时进行初始化。如果我对默认不满意,我可以

​​

然后有一个生成器不会与隐藏实例共享状态。如果您对这种方法感兴趣,请参阅random.py,这是非常有据可查的;只有少数相关的代码行并不那么棘手。

这种方法给单身人士带来了一个有趣的Pythonic扭曲:自动构建一个导入,但不阻止我实例化更多,如果我想。

相关问题