Python多文件程序

时间:2015-01-19 06:23:14

标签: python python-2.7 coding-style

对于较大的程序,为了更有条理,我一直在考虑将我的代码分成不同的.py文件,并有一个主文件,在需要时调用这些文件。我环顾四周,看到很多关于为python创建目录和SystemPath的评论。对于可以在几台计算机之间分发的程序,这些合理的选项是什么?作为测试我试图组装一个例子

#this is the class named 'grades' in the same directory as 'main'

class student:
    def __init__(self):
        self.name = ""
        self.score = 0
        self.grade = 0

    def update(self,name,score,grade):
        self.score = score
        self.name = name
        self.grade = grade
        print self.score,self.name,self.grade

s = student()
s.update(name,score,grade) 

这是我目前的主要脚本

from grades import score
import random

name = 'carl'
score = random.randrange(0,100)
grade = 11

s = student()
s.score(name,score,grade)

我对这种方法有一些问题:

1:有没有办法从不同的文件导入所有文件或我是否需要指定每个单独的类?

  1. 如果我只有一个功能,是否可以将其作为一个功能导入,或者只能通过一个类导入?
  2. 3.为什么当我在课堂上打电话时,我必须为它做一个变量,如下例所示?

    #way that works
    
     s = student()
    
     s.update(name,score,grade)
    
    #incorrect way
    
    student.update(name,score,grade)
    

    感谢您抽出宝贵的时间并思考我的问题。

5 个答案:

答案 0 :(得分:2)

通常,为了划分程序的源代码,Python使用模块来执行此操作,这对应于* .py文件。那么你的3个问题:

  1. 您可以导入整个"模块内容" (函数,类,全局变量,......)通过import module_name.*
  2. 对于一个函数,如果它是一个类中的函数(成员方法,类方法或静态方法),你不仅可以导入该函数,还应该导入类来使用该方法;如果它是模块下的函数,您可以通过导入module_name.function_name

  3. 单独导入该函数
  4. 更新是学生班级的成员函数,因此您应该通过实例使用它。如果它是类方法或静态方法,您可以通过您编写的类名来使用它。

答案 1 :(得分:2)

  1. 您可以将student的实例从其他脚本导入主脚本,如下所示:

    from grades import s
    # if your first script is called grades.py
    import random
    
    name = 'carl'
    score = random.randrange(0,100)
    grade = 11
    # you can directly use it without initializing it again.
    s.score(name,score,grade)
    

    2。 如果您在grades.py中有一个名为test()的函数,则可以通过以下方式导入它:

    from grades import test
    
    # then invoke it
    test()
    

    3。 这个变量代表班级学生的例子。您需要此实例来调用内部函数。

答案 2 :(得分:1)

  

1:有没有办法从不同的文件导入所有文件或我需要   指定每个单独的类?

您可以使用“通配符导入”,但您可能不应该这样做。看到 Should wildcard import be avoided?

  
      
  1. 如果我刚才有一个功能,是否可以将其导入为一个   功能还是只能通过课程导入?
  2.   

函数可以完全独立于Python中的类。

  

3.为什么当我在课堂上打电话时,我必须为它做一个变量,如下例所示?

您应该阅读面向对象的编程。在基本情况下,您必须实例化类的实例才能使用该类的功能。在您的示例中,班级学生描述了学生的意义以及声明

  

s = student()

创建一名学生,并将其命名为“s”。 我认为在阅读了一些关于面向对象编程之后应该清楚这一点。

答案 3 :(得分:1)

首先,您可以使用from module import *导入以下内容: hello.py:

def hello():
  print 'hello'

def bye():
  print 'Bye'

main.py:

from hello import *

hello()
bye()

但这不是一个好方法,如果你有两个文件,两个函数有相同的名字, 所以使用

from hello import hello, bye

hello()
bye()

更好,它是函数的一个例子,和class一样。

在第二个之前,学生是一个类,所以你必须使用一个实例对象来使用带有self参数的函数。如果你想使用student.function,该函数必须是这样的静态方法:

class Person:

  def __init__():
    pass

  @staticmethod
  def Count():
    return 1

print Person.Count()

其次,您可以在独立于类的类文件中导入该函数。

答案 4 :(得分:0)

  
      
  1. 有没有办法从不同的文件导入所有文件,还是我需要指定每个单独的类?
  2.   

答案是肯定的,因为python import语句使用sys.path(指定模块搜索路径的字符串列表),您需要在sys.path中添加模块的路径例如,如果要在不同的计算机之间进行交互,可以将模块放在public文件夹中,并将文件夹的路径添加到sys.path

import sys
sys.path.append( path to public )
  
      
  1. 如果我只有一个功能,是否可以将其作为一个功能导入,或者只能通过一个类导入?
  2.   

您只需使用from ... import function_name

  
      
  1. 为什么我一般打电话给一个班级时我必须为它做一个变量,如下例所示?
  2.   

对于这个问题,您只需要阅读python Class objects文档:

  

类对象支持两种操作:属性引用和实例化。