Python 中如何调用其他文件的类或函数

liftword2个月前 (03-25)技术文章6

从程序员的角度来说,跨文件调用是为了提高代码的模块化和可重用性。想象一下,如果你的程序非常庞大,所有的代码都挤在一个文件里,那将会变得难以维护和修改。通过将不同的功能模块拆分到不同的文件中,我们可以更好地组织代码,就像把一个大项目拆分成许多小的、易于管理的任务。

那么,如何实现跨文件调用呢?

1、同一目录下的文件调用

假设你有两个 Python 文件 module1.py 和 main.py,它们位于同一个目录中。

# module1.py
# 定义一个函数
def add(a, b):
    return a + b

# 定义一个类
class MyClass:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"Hello, {self.name}!")
# main.py
# 方式一:直接导入模块,然后通过模块名调用函数和类
import module1

# 调用 module1 中的函数
result = module1.add(3, 5)
print(result)

# 创建 module1 中类的实例并调用方法
obj = module1.MyClass("Alice")
obj.greet()

# 方式二:从模块中导入特定的函数和类
from module1 import add, MyClass

# 直接调用函数
result = add(4, 6)
print(result)

# 创建类的实例并调用方法
obj = MyClass("Bob")
obj.greet()

2、不同目录下的文件调用

当要调用的文件位于不同目录时,需要根据具体情况处理。

  • 子目录中的文件调用
#plaintext
project/
├── main.py
└── subfolder/
    └── module2.py
# module2.py
def multiply(a, b):
    return a * b
#main.py
import sys
# 将子目录路径添加到系统路径中
sys.path.append('./subfolder')

# 导入子目录中的模块
from module2 import multiply

# 调用函数
result = multiply(2, 3)
print(result)
  • 上级目录中的文件调用
project/
├── module3.py
└── subfolder/
    └── main.py
# module3.py
def divide(a, b):
    if b != 0:
        return a / b
    return None
# main.py
import sys
import os
# 获取上级目录路径
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 将上级目录路径添加到系统路径中
sys.path.append(parent_dir)

# 导入上级目录中的模块
from module3 import divide

# 调用函数
result = divide(10, 2)
print(result)

3、使用包进行调用

当项目规模较大时,通常会使用包来组织代码。包是包含 __init__.py 文件的目录。

project/
├── main.py
└── mypackage/
    ├── __init__.py
    └── module4.py
# main.py
# 导入包中的模块
from mypackage.module4 import power

# 调用函数
result = power(2, 3)
print(result)

在上述各种调用方式中,需要注意以下几点:

  • 确保文件路径正确,特别是在处理不同目录下的文件调用时。
  • 当使用 sys.path.append() 时,要注意路径的相对和绝对问题,避免因路径错误导致导入失败。
  • 在使用包时,__init__.py 文件在 Python 2 中是必需的,用于标识该目录为一个包;在 Python 3 中,虽然它不是严格必需的,但仍可用于初始化包或控制导入行为。


相关文章

Python出错的或电路

def count_affected_swaps(N, A, B): # 将输入的二进制字符串转换为列表 A = list(A) B = list(B) #...

异或的魅力!图解「数组中两个数的最大异或值」

今天分享的题目来源于 LeetCode 第 421 号问题:数组中两个数的最大异或值。在 异或 这个知识点里面属于一个中高难度的题目。题目描述 给定一个非空数组,数组中元素为 a0, a1, a2,...

Python中怎么给属性增加类型检查或合法性验证?

问题 你想给某个实例 attribute 增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。 解决方案 自定义某个属性的一种简单方法是将它定义为一个 property。例如,下面的代码定义...

python散装笔记——105: 从字符串或列表写入 CSV

ParameterDetailsopen ("/path/", "mode")指定 CSV 文件的路径open (path, "mode")指定打开文件的模式(读、写等)csv.writer(file...

Python静态方法@使用,类或函数调用之带括号、不带括号

20221209星期五:1,函数加了静态 @staticmethod ,类不进行实例化,就可以进行调用函数2,函数调用带括号,调用的是函数的执行结果;3,函数调用不带括号,调用的是函数本身,得到的是一...

Python将两个或多个列表合并为一个列表的列表

将两个或多个列表合并为一个列表,并根据每个输入列表中的元素的位置将其组合在一起。这个需求在实际开发过程中应该说非常常见,当然python也给我们内置了相关方法!zip(*iterables, stri...