创建我自己的python模块 - 问题

时间:2013-06-09 20:13:36

标签: python python-3.x

我正在创建自己的python模块,它包含一些我想要使用的函数。我想知道如何做这些事情:

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

2 个答案:

答案 0 :(得分:2)

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

    from mymodule import myobject
    

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

    1. 我是否总是必须为我的函数创建一个类,即使我永远不会使用该类的多个对象? (如果不是,如何创建一个包含所有自变量的函数,那么它们不会从整个代码中搞砸全局变量?)(但不使用def fun(self,var1,var2 ...)因为我不想打电话给乐趣(“”,var1,var2 ......)
    2. 这是你要问的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
      

      然后当你制作一个模块时,你会根据你需要它们来声明函数和对象。如果你有一组函数在同一组变量上工作,你需要将它们封装为一个类中的“成员”,将函数转换为将作用于这些成员的方法,为类创建行为并公开类的用户的类。然后,他们会将你的班级变成具有自己价值观的对象并且快乐。

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

      所以,总而言之,这是软件设计的问题,在互联网和图书馆中有很多关于这些主题的书籍。我很确定你可以找到关于“what's the best OO software design book?

      的问题
      1. “安装”我的模块或像外部文件一样使用它是否更好?
      2. 在分发代码时,使用distutils / setuptools安装模块总是更好。为了帮助您开发软件,您最好使用像zc.buildoutvirtualenv这样的工具(第一个更强大,但更复杂,当您需要开发环境构建系统时通常很有用,第二个非常简单易用,有助于为开发做好准备。

        你可以在那里找到教程:

        HTH

答案 1 :(得分:1)

你不一定要在python中创建一个类,但是使用类会帮助你将函数和变量包装到一个对象中。