Python 多文件程序

Python Multiple file program

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

这是与 main

在同一目录中名为 grades 的 class
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. 有没有办法从不同的文件导入所有文件,或者我是否需要指定每个文件 class?
  2. 如果我只有一个函数,是否可以将其作为函数导入,或者只能通过 class 导入?
  3. 为什么当我调用一个 class 时,通常我必须为它创建一个变量,如下例所示?
# way that works
s = student()
s.update(name,score,grade)

# incorrect way
student.update(name,score,grade)

感谢您花时间思考我的问题。

1: Is there a way to import all from different file or do i need to specify each individual class?

您可以使用 "wildcard import",但您可能不应该使用。看 Should wildcard import be avoided?

  1. If i just had a function, is it possible to import it just as a function or can you only import via a class?

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

3.Why is it when i call upon a class in general i have to make a variable for it as in the example below?

您应该阅读面向对象编程。在基本情况下,您必须实例化 class 的实例才能使用 class 的功能。在您的示例中,class 学生描述了成为学生的意义,而陈述

s = student()

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

一般对一个程序的源码进行分割,Python使用模块来分割,对应一个*.py文件。那么对于你的3个问题:

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

  4. 单独导入函数
  5. update是学生class的成员函数,所以要通过实例来使用。如果是class方法或者静态方法,可以通过你写的class名字来使用

  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。 该变量代表 class 学生的实例。你需要这个实例来调用里面的函数。

  1. Is there a way to import all from different file or do i need to specify each individual class?

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

import sys
sys.path.append( path to public )
  1. If i just had a function, is it possible to import it just as a function or can you only import via a class?

你只需要使用 from ... import function_name.

  1. Why is it when i call upon a class in general i have to make a variable for it as in the example below?

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

Class objects support two kinds of operations: attribute references and instantiation.

首先,您可以使用 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一样。

Third before Second,student是一个class,所以你必须使用一个实例对象来使用带有self参数的函数。如果要使用student.function,函数必须是像这样的静态方法:

class Person:

  def __init__():
    pass

  @staticmethod
  def Count():
    return 1

print Person.Count()

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