说来惭愧,我写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
,里面可以有多个函数,调用的时候直接模块名.文件名.函数名
即可。
版权属于:作者名称
本文链接:https://www.sitstars.com/archives/74/
转载时须注明出处及本声明