python笔记 - model package

  1. 1. 概念
    1. 1.1. model
    2. 1.2. package
  2. 2. 实例
    1. 2.1. model
    2. 2.2. package
  3. 3. relative import

概念

model

一个python中的组织单位,独立构成一个命名空间

本身是一个Python object 同时也可以包含多个Python object

在实际中model常常对应一个.py文件

model 是一个python运行时的概念,保存在内存中

文件是操作系统级的概念

import可以从一个文件中生成一个model

package

一种特殊的model,在Python中package比model多一个__path__属性

在操作系统级package通常对应一个文件夹,package中可以有subpackage model

实例

model

1
2
3
4
5
6
7
8
import test
'''使用test字符串作为名字来寻找model,
寻找顺序 缓存 > builtinmodel > sys.ptah(按顺序),一旦找到就停止寻找
找到后在单独的命名空间中运行 (load)
最后赋值给tetst
'''
print(test) #<module 'test' from 'F:\\python\\pyEasyFile\\test.py'>

当然我们可以将 load 和 赋值 分开

1
2
3
import test as t
print(test) #NameError: name 'test' is not defined
print(t) #<module 'test' from 'F:\\python\\pyEasyFile\\test.py'>

我们也可以只拿model里面的一个object

1
2
3
4
5
from test import A
print(A) #<class 'test.A'>

from test import A as myA
print(myA) #<class 'test.A'>

package

example.py

1
2
3
4
5
6
import mypackage
#执行__init__.py中的代码
print(mypackage.B) #<class 'mypackage.B'>
print(dir(mypackage)) #['B', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

# 除了__init__其余不会引入

__init__.py

1
2
class B:
pass

引入package下的model

1
2
3
4
5
6
7
8
9
10
11
import mypackage.mymodel
#赋值mypackage变量为package
#添加一个属性mymodel

print(mypackage.mymodel) #<module 'mypackage.mymodel' from 'F:\\python\\pyEasyFile\\mypackage\\mymodel.py'>
print(mypackage) #<module 'mypackage' from 'F:\\python\\pyEasyFile\\mypackage\\__init__.py'>
print(dir(mypackage)) #['B', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'mymodel']

import mypackage.mymodel as Mymd
print(Mymd) #<module 'mypackage.mymodel' from 'F:\\python\\pyEasyFile\\mypackage\\mymodel.py'>
print(mypackage) #NameError: name 'mypackage' is not defined

relative import

常用于包里面的model之间相互引用

1
2
3
4
5
# absolute import
from mypackage.util import f

# relative import (同一层级)
from .util import f

注意relative import 在运行时会转化使用__package__属性拼接目录,当我们直接运行model时__package__为 main model 不属于任何的model