为什么在具有函数的模块上使用python类?

时间:2016-12-02 10:27:00

标签: python python-3.x class module

我正在教自己python(3.x),我正在尝试理解类的用例。我开始明白他们实际做了什么,但我很难理解你为什么要使用一个类而不是创建一个带有函数的模块。

例如,如何:

        <dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.7.2</version>
        </dependency>

不同于:

class cls1:
    def func1(arguments...):
    #do some stuff


obj1 = cls1()
obj2 = cls1()

obj1.func1(arg1,arg2...)
obj2.func1(arg1,arg2...)

这可能很简单,但我无法理解它。

到目前为止,我已经在编写python程序方面取得了相当大的成功,但它们都是程序性的,并且只导入基本的模块函数。课程是我的下一个最大障碍。

4 个答案:

答案 0 :(得分:5)

如果您需要多个实例,并且希望这些实例不会相互干扰,则可以使用该类。

模块的行为类似于单例类,因此您只能有一个实例。

编辑:例如,如果你有一个名为example.py的模块:

    x = 0
    def incr():
           global x
           x = x + 1

    def getX():
           return x

如果您尝试两次导入这些模块:

    import example as ex1
    import example as ex2

    ex1.incr()
    ex1.getX()
    1
    ex2.getX()
    1

这就是模块只导入一次的原因,因此ex1和ex2指向同一个对象。

答案 1 :(得分:2)

只要你只使用纯函数(仅对其参数起作用的函数,总是为相同的参数集返回相同的结果,不依赖于任何全局/共享状态而不改变任何事情 - 既不是他们的论点也不是任何全局/共享状态 - 没有任何副作用的IOW函数),那么类确实使用相当有限。但那是functional programming,虽然Python在技术上可以用于功能风格,但它可能不是这里的最佳选择。

您必须尽快在函数之间共享状态,特别是如果其中一些函数应该更改此共享状态,那么您确实可以使用OO概念。在函数之间共享状态主要有两种方法:将状态从函数传递给函数,或者使用全局变量。

第二种解决方案 - 全局状态 - 众所周知是麻烦的,首先是因为它使得对程序流程(因此调试)的理解更加困难,但也因为它会阻止您的代码成为reentrant,这是一个明确的对于很多现在常见的用例(多线程执行,大多数服务器端Web应用程序代码等)都是禁忌。实际上它使你的代码几乎无法使用或几乎无法使用除了简单的一次性脚本之外的任何东西......

第二个解决方案通常意味着使用半非正式的复杂数据结构(带有一组给定键的dicts,通常持有其他dicts,列表,dicts列表,集合等),正确初始化它们并将它们从函数传递到函数 - 当然还有一组适用于给定数据结构的函数。 IOW您实际上是使用语言提供的最低级别工具来定义新的复杂数据类型(数据结构和该数据结构上的一组操作)。

类实际上是一种在更高级别定义此类数据类型的方法,将数据和操作组合在一起。它们还提供了更多,特别是polymorphism,这使得更通用,可扩展的代码,以及更容易的单元测试。

答案 2 :(得分:2)

考虑您拥有包含产品的文件或数据库,并且每个产品都有产品ID,价格,可用性,折扣,以Web状态发布以及更多值。你有第二个文件,包含数千种含有新价格,可用性和折扣的产品。您希望更新值并控制将要更改的产品数量和其他统计信息。您可以使用过程编程和函数式编程来完成它,但是您会发现自己试图发现使其工作的技巧,并且很可能您会在许多不同的列表和集合中丢失。

另一方面,使用面向对象编程,您可以使用实例变量创建一个类Product,其中包括product-id,旧价格,旧可用性,旧折扣,旧发布状态以及新值的一些实例变量(新价格,新可用性,新折扣,新发布状态)。您所要做的就是阅读第一个文件/数据库,并为每个产品创建Product类的新实例。您可以阅读第二个文件并找到产品对象的新值。最后,第一个文件/数据库的每个产品都将成为一个对象,并将被标记并携带旧值和新值。这种方式更容易跟踪更改,统计和更新数据库。

又一个例子。如果使用tkinter,则可以为顶级窗口创建一个类,并且每次要显示信息窗口或关于窗口(具有自定义颜色背景和尺寸)时,您只需创建此类的新实例。

对于简单的事情,不需要课程。但对于更复杂的事情,类有时可以使解决方案更容易。

答案 3 :(得分:1)

我认为最好的答案是它取决于你的缩进对象应该是什么/做什么。但总的来说,类和导入模块之间存在一些差异,这会给当前模块中的每个模块带来不同的功能。最重要的是,类被定义为对象,这意味着它们有很多选项可以像模块不具备的对象一样。例如,一些特殊属性,如__getattr____setattr____iter__等。还可以创建大量实例甚至控制它们的创建方式。但对于模块,文档完美地描述了它们的用例:

  

如果你退出Python解释器并再次输入,那么   您所做的定义(函数和变量)将丢失。   因此,如果你想写一个更长的程序,你就是   最好使用文本编辑器来准备输入   解释器并以该文件作为输入运行它。这是   称为创建脚本。随着你的程序变得越来越长,你可能想要   将其拆分为多个文件以便于维护。你也可以   想要使用你在几个程序中编写的方便功能   不将其定义复制到每个程序中。

     

为了支持这一点,Python可以将定义放在文件中并使用   它们在脚本或解释器的交互式实例中。   这样的文件叫做模块;模块中的定义可以是   导入到其他模块或主模块(集合)   您在顶部执行的脚本中可以访问的变量   水平和计算器模式)。