python 模块定义方法_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,里面可以有多个函数,调用的时候直接模块名.文件名.函数名即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值