客至汲泉烹茶, 抚琴听者知音

python引入自定义模块方法总结

说来惭愧,我写python的时候都是一个项目一个文件用到底,中间定义无数个函数,新项目有类似的函数就去其他py文件中复制,后来看了别人的代码,感觉自己这样写不够“优雅”,于是决定了解并总结一下如何导入自定义模块。

基础概念

类是我初学python的时候就没搞太懂的知识点,后来写代码也从来没用过它,但其实它是很有用的,尤其是项目比较大的时候。所谓类,即具有相同的属性和方法的对象的集合。所谓方法,就是类中定义的函数。也就是说,把你写的相关函数放到一起,就变成类了。来个简单的例子感受一下,新建一个firstclass.py,然后写入以下代码:

class class1():
# 括号内是该类的父类,不填的话默认是object类,也即所有类的父类,也可省略括号
    blog = "yanshu's garden" 
    # 绑定一个属性到类上,可以通过class1.blog访问
    def print_info(self, name, age):
    # self代表类本身,无需为它传实参
        print('my name is {0},i am {1} years old'.format(name,age))

调用它的话,首先需要实例化一个类(即创建一个具体对象)x=class1(),然后就可以调用类中的属性和函数了

print(x.blog) 
# 调用属性,等价于print(class1.blog)或print(class1().blog)
>>> yanshu's garden

x.print_info('yanshu',22)
# 调用函数,等价于class1().print_info('yanshu',22)
>>> my name is yanshu,i am 22 years old

调用类中函数时类名后有括号,能不能去掉?当然可以,但是这样的话就要同时把self参数去掉,也即:

class class1():
    blog = "yanshu's garden" 
    def print_info(name, age):
        print('my name is {0},i am {1} years old'.format(name,age))

class1.print_info('yanshu',22)
>>> my name is yanshu,i am 22 years old

这样的话,函数之间就毫无联系了,而我们创造类的一个重要目的,就是为了让各函数之间共用同一个属性。为了实现这点,类中有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用,可利用该方法绑定默认属性。

class class2():      
    def __init__(self, name, age):        
        self.name = name
        self.age = age
    
    def print_info(self):
        print('my name is {0},i am {1} years old'.format(self.name,self.age))

class2('yanshu',22).print_info() # 也可以先实例化
>>> my name is yanshu,i am 22 years old

这样,把参数传递给类,各个方法再调用这些参数进行处理,只需传一次参数即可。上面一段代码其实是把参数传递给方法了,那么有多少个方法,就要传多少次参数,这样就失去了类的意义。

调用类

我们在类文件夹同一目录下新建一个test.py文件,如果想要在test中调用class2,就如同引入其他模块一样

import firstclass # import 文件名
firstclass.class2('yanshu',22).print_info() # 文件名.类名.函数名,注意类名要传递参数

# 或者

from firstclass import class2
class2('yanshu',22).print_info()

当然,你也可以把参数传递给类名,只需如第三段代码一样把类的self参数去掉即可。

如果我test.py文件和firstclass.py不在同一文件夹呢?

很简单,无需考虑相对路径绝对路径等问题,只需要把类文件所在路径添加到系统路径,然后再导入py文件即可。

import sys
sys.path.append(r"E:\python\module")
from firstclass import class2

class2('yanshu',22).print_info()
>>> my name is yanshu,i am 22 years old

函数

导入单文件

和导入类一样,直接import即可。假如在E:\python\module下有个func01.py,里面的代码为:

def func01(alist):
    return '*'.join(alist)

那么导入使用:

import sys
sys.path.append(r"E:\python\module")

import func01
alist = ['a','b','c']
print(func01.func01(alist))

>>> a*b*c

导入文件夹

这就类似我们常常用到的包了,首先建立一个文件夹mymodule,文件夹名即模块名,下面有两级目录,一级目录是类(为了方便理解我这样叫它),二级目录是函数,其中根目录下也可以有.py文件。文件结构如下:

mymodule
|-- __init__.py
|-- class01
|   |-- func01.py
|   |-- func02.py
|   |-- __init__.py
|-- class02
|   |-- func03.py
|   |-- __init__.py
|-- func_root.py 

__init__.py的作用是标识该目录是为python的模块包,同时也方便导入各个模块。其中,根目录下的__init__.py代码如下:

import mymodule.class01
import mymodule.class02
import mymodule.func01

class01下的__init__.py代码如下:

from .func01 import func01
from .func02 import func02

class02类似。注意函数文件名要与里面的函数名一样,即func01.py里面只能有一个函数func01。然后就可以调用了

import sys
sys.path.append(r"E:\python\module") # 模块文件夹mymodule的父文件夹
import mymodule as mm

mm.class01.func01() # 模块名.文件夹名.文件名

当然,对于根目录下的func_root.py,里面可以有多个函数,调用的时候直接模块名.文件名.函数名即可。

添加新评论