本文共 4611 字,大约阅读时间需要 15 分钟。
包
不同项目有相同的.py文件
注
非py文件放在文件夹(directory)中,py文件放在包中
想把user变成包,右键user--->new--->python file--->__init__.py,如下图
包起名要遵守命名规范,基本是纯英文
一个包中可以存放多个模块(.py文件),故包的概念比模块大一级
延申-包含关系:项目>包>模块>类>函数 变量
artical\model1
class Article: def __init__(self,name,author): self.name=name self.author=author def show(self): print('发表文章:{}的作者是:{}'.format(self.name,self.author))class Tag:#文章标签 def __init__(self,name): self.name=name
user\model1
class User: def __init__(self,username,password): self.username=username self.password=password def login(self,username,password): if username==self.username and password==self.password: print('登录成功') else: print('登录失败') def show(self): print(self.username,self.password)
package.py
#使用包中模块中的User类# from user import model1# u=model1.User('admin','123456')# u.show()from user.model1 import User #包名.模块名u=User('admin','123456')u.show()from article.model1 import Articlea=Article('个人总结','佳伟')a.show()'''admin 123456发表文章:个人总结的作者是:佳伟'''
'''article -model1.py -__init__.py -...user -model1.py -__init__.py -...package.py'''
from 包 import 模块
from 包.模块 import 类|函数|变量 推荐用这个绝对路径 当时试的时候别的方法有出错
from 包.模块 import * (__all__=[''],专为*号准备)
内容同模块
用户发表文章
user\model1.py
class User: def __init__(self,username,password): self.username=username self.password=password def login(self,username,password): if username==self.username and password==self.password: print('登录成功') else: print('登录失败') def publish_article(self,article): #article是对象 print(self.username,'发表了文章:',article.name) def show(self): print(self.username,self.password)print('User')
artical\model1.py 同上
test.py
'''article -model1.py -__init__.py -...user -model1.py -__init__.py -test.py #明确test的位置 #test要用自己同包里mosel1的user,又要用article里的model1'''#创建用户对象#import model1 同一个包也不建议这么导入#from user.model1 import User 可以,也可以用下面的from .model1 import User #.表示从当前目录下,即此模块test.py所在的目录 导入 类似于相对路径from article.model1 import Article#导入一般放在最前面user=User('admin','123456')#user是通过导入的User类创建#发表文章--->要有文章对象article=Article('个人总结','jiawei')user.publish_article(article)'''Useradmin 发表了文章: 个人总结'''
跨包访问模块只要记住模块在哪个包就可以
from是基于项目下开始搜索的
任务:test里调用calculate里的add求和
位置:test外层的里面的calculate
list1=[1,6,4,8]from calculate import addresult=add(*list1)print(result)'''19'''
__init__.py文件
导入包时默认调用__init__.py,执行的东西(函数、类等)加载到内存 可以理解为初始化加载
导入包,默认执行的东西就放在__init__.py中
作用
1.当导入包时,把初始化函数、变量、类等定义在__init__.py文件里面
2.此文件中的函数、变量等的访问只需要通过包名.函数名/变量名调用
3.结合__all__=[通过*可以访问的模块]
注:flask中会用到
例:
__init.py
print('--->user的__init__')def printA(): print('--->AAAAA')
import user#直接导入包#from user.model1 import Useruser.printA()'''--->user的__init__--->AAAAA'''
--->user的__init__ 是__init__.py默认执行的
--->AAAAA是调用__init__.py里的printA函数显示的
from 包名 import *
*号把包里的内容都给了,为什么看不到model1?
在__init__.py开头加上__all__=['model1']后
from user import *user=model1.User('admin','123456')user.show()'''--->user的__init__admin 123456'''
model1就能正常使用,__all__表示向外暴露
compare
from 模块 import *
表示可以使用模块里面的所有内容,如果没有定义__all__=['','',...]
若添加了__all__=['','',...],则只有__all__=['','',...]列表里的内容可以访问
from 包名 import *
表示该包中的内容(模块)不能访问,如果没有定义__all__=['','',...]
若在__init__.py中添加了__all__=['','',...],列表中为可以通过*号可以访问的模块
循环导入 大型python项目中由于架构不当,出现模块间相互引用的情况
错误方式举例
A: A模块
def test()
f()
B: B模块
def f()
test()
tip:alt+回车,自动导入
xunhuandaoru1.py
from user.xunhuandaoru2 import funcdef task1(): print('---task1---')def task2(): print('---task2---') func()task1()'''ImportError: cannot import name 'func' from partially initialized module 'user.xunhuandaoru2' (most likely due to a circular import) '''
xunhuandaoru2.py
from user.xunhuandaoru1 import task1def func(): print('---2中的func---1---') task1() print('---2中的func---2---')
解决办法:避免产生循环导入
1.重新架构
2.将导入的语句放到函数里面
3.把导入语句放到模块的最后
xunhuandaoru1.py
from user.xunhuandaoru2 import funcdef task1(): print('---task1---')def task2(): print('---task2---') func()task1()task2()'''---task1------task2------2中的func---1------task1------task2------2中的func---1------task1------2中的func---2------task1------2中的func---2---'''
加载时会默认调一遍task1和task2
xunhuandaoru2.py
def func(): print('---2中的func---1---') from user.xunhuandaoru1 import task1 task1() print('---2中的func---2---')
运行结果很混乱,再修改
from user.xunhuandaoru2 import funcdef task1(): print('---task1---')def task2(): print('---task2---') func()if __name__=='__main__': #藏进来 task1() task2()'''---task1------task2------2中的func---1------task1------2中的func---2---'''
别人调用的时候只用函数,函数里又调的东西就别调了
转载地址:http://kkegn.baihongyu.com/