Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为“创建Python类”;只有一个例子;?_Python_Oop - Fatal编程技术网

为“创建Python类”;只有一个例子;?

为“创建Python类”;只有一个例子;?,python,oop,Python,Oop,我问的这个问题是关于Python的,尽管它可能适用于大多数OOP语言 当我只希望在任何程序中只使用一次数据模型时,我可以使用类/静态方法和属性创建一个类,或者只创建一个常规类并实例化一次,并且只使用该副本。在这种情况下,哪种方法更好?为什么 使用python,我还可以编写一个模块并像使用类一样使用它。在这种情况下,哪种方式更好,为什么 示例:我希望有一个中央数据结构来访问/将数据保存到文件中 模块方式: data.py attributes = something ... def save():

我问的这个问题是关于Python的,尽管它可能适用于大多数OOP语言

当我只希望在任何程序中只使用一次数据模型时,我可以使用类/静态方法和属性创建一个类,或者只创建一个常规类并实例化一次,并且只使用该副本。在这种情况下,哪种方法更好?为什么

使用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()

模块用于将公共结构封装在“名称空间”中。但实际上在python中,模块只是一个文件,您可以按照自己的意愿组织它们。有些人把很多功能放在一个模块中。有些人将它们分散在包或子包上。取决于您想要的可重用性。如果一个模块有大量依赖项,而您只想重用少量依赖项,那么拆分它们是有意义的

类允许您定义可以作为子类型继承的类型。它们还允许您使用该类的每个实例定义一个状态

当您的类没有状态,只有staticmethods/classmethods时,您可能不需要类。你只需要函数

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


如果您所追求的是常量,这意味着它们在应用程序的生命周期中只定义了一次,那么只需创建一个带有一系列基本类型(如字符串、dict和列表)的constants.py模块

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

例如,如果我调用
random.random()
,它将使用在导入时初始化的类random的隐藏实例。如果我对默认设置不满意,我可以

my_random = random.Random()
my_random.seed('not needed but illustrative seed call')
coin_toss = my_random.random()
然后有一个不与隐藏实例共享状态的生成器。如果您对这种方法感兴趣,请阅读
random.py
,它有很好的文档记录;只有几行相关的代码没有那么棘手


这种方法在单例上提供了一个有趣的python扭曲:在导入上自动构建一个,但如果需要,不要阻止我实例化更多。

为什么要否决?这是一个合法的编程问题。搜索stackoverflow for
singleton python
修改后的问题要好得多。我认为目前还不需要关闭(除了一个副本)。@warwaruk:有趣的是,在python中使用模块是一种建议的单例操作方法,这根本无助于回答我的问题。您可以使用一个有点像类的模块(参见我的示例),尽管它看起来有点不成熟。我正在寻找状态和方法,但我只需要一个实例,所以我使用类还是实例?您只使用模块的作用域。除了作为模块对象之外,它与类不同。任何对象都可以有属性。状态和方法有时建议使用单例模式。虽然有些人不赞成他们是坏作风。如果它有状态和设置,并且需要特定的功能,那么它可以是一个普通类。不过,您应该避免使用主动修改全局变量的结构。常量通常是只读的,这样我就会滥用模块;很高兴知道。那么类和实例呢?我不是在修改全局变量,这是OOP的重点。我想把变量绑定到一个对象,但我在类和实例之间争论。既然类在Python中也是对象,那么使用singleton和直接使用类(带有类方法/属性)会有什么优点/缺点?