2

我正在创建我自己的 python 模块,它有一些我想使用的功能。我想知道如何做这些事情:

  • 如何继续使用名为 module.py 的 python 模块,以便在调用“import module.function”时只导入我想要的函数?(所以我不必导入整个模块)
  • 我是否总是必须为我的函数创建一个类,即使我永远不会使用该类的多个对象?(如果没有,如何创建一个包含所有 self 变量的函数,这样它们就不会与整个代码中的全局变量混淆?)(但不使用 def fun(self, var1, var2...) 因为我不想打电话给 fun("", var1, var2...)
  • 是“安装”我的模块还是像外部文件一样使用它更好?
4

2 回答 2

2
  1. 如何继续使用名为 module.py 的 python 模块,以便在调用“import module.function”时只导入我想要的函数?(所以我不必导入整个模块)

使用语法

from mymodule import myobject

您可以导入在模块文件的顶层声明的任何对象(您也可以通过在对象中声明所有“公共”对象来覆盖它以隐藏一些__all__对象)。但正如@BrenBam 所说,无论您是from mymodule ...还是import module,解释器仍会从该模块加载所有顶级对象,但只会公开您选择的对象。

  1. 我是否总是必须为我的函数创建一个类,即使我永远不会使用该类的多个对象?(如果没有,如何创建一个包含所有 self 变量的函数,这样它们就不会与整个代码中的全局变量混淆?)(但不使用 def fun(self, var1, var2...) 因为我不想打电话给 fun("", var1, var2...)

这是您要问的 OOP 软件设计问题。根据定义,函数具有参数和一个输出,仅此而已,例如:

function foo(arg1, arg2):
    return arg1+arg2

它的用法再简单不过了:

>>> print foo(1,2)
3

方法是绑定到类的函数,(在 python 中)具有对当前对象(或类)的引用:

class Foo():
    def set_arg1(self, arg1):
        self.arg1 = arg1
    def set_arg2(self, arg2):
        self.arg2 = arg2
    def foo(self):
        return self.arg1+self.arg2

然后将Foo类实例化为一个对象,并使其对数据起作用:

>>> bar = Foo()
>>> bar.set_arg1(1)
>>> bar.set_arg2(2)
>>> print bar.foo()
3

然后当你制作一个模块时,你根据你需要它们做什么来声明函数和对象。如果您有一组处理同一组变量的函数,您将希望将它们封装为一个类中的“成员”,将这些函数制作成将作用于这些成员的方法,为该类创建一个行为并公开向您的模块的用户提供该类。然后,他们会将您的类实例化为具有自己价值的对象并感到高兴。

如果您的函数正在接受参数,将它们转换为一组结果而不与函数外部的变量交互,那么您将希望保持它们原样:只是简单的函数。

所以,总而言之,这是一个软件设计的问题,并且有很多关于这个主题的书籍,在互联网上和图书馆里。我很确定你可以找到一个关于“什么是 最好的 OO 软件 设计 书? ”的问题。

  1. 是“安装”我的模块还是像外部文件一样使用它更好?

在分发代码时使用distutils/安装模块总是更好。setuptools为了帮助您开发软件,您最好使用类似zc.buildoutor的工具virtualenv(第一个更强大,但更复杂,通常在您需要 dev env 构建系统时很有用,第二个非常易于使用并且确实有助于让您的环境为开发做好准备)。

您可以在那里找到两者的教程:

高温高压

于 2013-06-09T20:48:56.677 回答
1

您不一定必须在 python 中创建一个类,但使用类可以帮助您将函数和变量包装到一个对象中。

于 2013-06-09T20:36:34.387 回答