一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天
包
包的定义
包的里面只能放python格式的文件(这个文件内必须有__ init __.py文件)
在上幅图中模块包和项目是这样的关系:项目-->包-->模块
包的导入
- 我们可以在一个包里定义多个模板
User
|-- __init__.py
|--model1.py
|-- User
|-- model2.py
|-- Art
Artical
|-- __init.py
|-- note.py
run.py
# model1
class User:
def __init__(self,username,password):
self.username = username
self.password = password
def login(self,username,password):
if self.username == username and self.password == password:
print('登陆成功')
else:
print('登录失败')
def show(self):
print('admin:{},password:{}'.format(self.username,self.password))
下面我们想调用包里面的类和方法怎么办呢?
- from ... import ...
#调用包内的模块
from User import model1
user = model1.User('admin',123456)
user.show()
#调用包内的模块中的类
from User.model1 import User
user = User('admin',123456)
user.show()
#调用包里所有的模块的方法
import User.model1 import *
注意:在这里特别注意一下,我们在一个包中,两个模块在相互调用时也必须遵守上述的导入规则,并不能因为两者在一个包内就可以随意调用,如果真的要偷懒可以这样调用(不推荐)
# 比如在model1里面调用model2
from .model2 import Art
包的__ init __.py文件
当导入包时,默认执行__ init __.py这个文件的内容(其实与前面的魔术方法类似,就是打开包直接初始化,不用二次调用)
- 所以我们要用该文件内的东西直接导包即可
import 包的名
- 作用
- 当导入包时,把一些初始化函数,类定义在__ init __.py文件中
- 此文件的函数和变量访问只需要通过导入包就能使用即(包名.函数名())即可使用
- 如果在此文件中加入__ all __ = ['模块a'],那我在使用
from 包名 import *方法就能直接使用all列表里暴露的模块a
# User的__init__.py
__all__ = ['model1']
#直接调用包的所有东西
from User import *
#因为上面的__init__.py内向外面暴露了model1,所以我们直接这样导入可以使用model1的东西
user = model1.User('admin',123456)
单例模式
为了不让每次创建对象时都开辟内存,我们在开发中就会使用单例模式
- 对__ new __方法重写
class Sing:
# 私有化,让单例的地址存在于此
__instance = None
#重写__new__
def __new__(cls):
if cls.__instance is None:
cls.instance = object.__new__(cls)
return cls.instance
else:
return cls.__instance
- 优点:保证单线程的安全,可以节省内存空间