包是一種組織管理代碼的方式,包里面存放的是模塊
用於將模塊包含在一起的文件夾就是包
包內包含__init__.py標志性文件
定義一個學生類,一個sayhello函數,一個打印語句
# p01.py class Student(): def __init__(self, name="NoName", age=18): self.name = name self.age = age def say(self): print("My name is {}".format(self.name)) def sayhello(): print("Hi,你好") print("我是模塊p01")
一、定義一個Student類,因p01已定義好,所以直接調用
import p01 a = p01.Student("hh",19) a.say() p01.sayhello() #此段代碼會先執行p01中的print,因為導入模塊,就相當於把p01整段代碼都導入進來,執行的時候會全部執行一遍
二、導入名字以數字開頭的包
#01.py,以數字開頭的模塊 class Student(): def __init__(self, name="NoName", age=18): self.name = name self.age = age def say(self): print("My name is {}".format(self.name)) def sayhello(): print("Hi,你好") print("我是模塊p01")
# import 01 # 基於python變量的命名規則,不能以數字開頭 # 借助於importlib包可以實現導入以數字開頭的模塊名稱 import importlib A = importlib.import_module("01") a = A.Student() a.say()
三、導入p01模塊,並重新命名為 p
import p01 as p a = p.Student("hh",18) a.say()
四、只想用Studen類,別的不想要
from p01 import Student #有選擇性的導入 #使用時候不需要模塊名稱的前綴 a = Student("hh", 20) a.say()
五、針對四導入Studen類,為何還會執行print
# p01.py,修改p01代碼 class Student(): def __init__(self, name="NoName", age=18): self.name = name self.age = age def say(self): print("My name is {}".format(self.name)) def sayhello(): print("Hi,你好") # 可以有效避免代碼被導入的時候被動執行的問題 # 建議所有程序的入口都以此代碼為入口 if __name__ == "__main__": print("我是模塊p01")
六、導入包下的所有
# 導入p01模塊下的所有 from p01 import * # 不需要前綴有個壞處,名稱太多容易引起混亂 sayhello() a = Student("hh", 19) a.say()
七、查看所有的包的路徑 及 添加路徑
import sys print(type(sys.path)) # 獲取路徑列表 # 查看包的路徑,以方便使用時候的調用 print(sys.path) for i in sys.path: print(i) # 添加路徑 # sys.path.append(dir)
以下內容舉例描述不便,文字描述一下
包內模塊調用與模塊同級的包用法
語法:import package_name.module
導入包中某一個具體的模塊
使用方法:
package_name.module.func_name
package_name.module.class.func()
package_name.module.class.var
跟上述用法都差不多
語法 :from package import module1,module2, ......
此種導入方法不執行 '__init__'的內容
使用方法:
from package import module
module.dunc()
語法:from package import *
導入當前包 '__init__.py' 文件中的所有函數
使用方法:
func_name()
class_name.func_name()
class_name.var
語法: from package.module import *
導入包中指定模塊的所有內容
使用方法:
func_name()
class_name.func_name()
經常使用其他路徑下的包,可以在當前包中直接導入
import 完整包或者模塊的路徑
'__all__'的用法,具體百度了解下
在使用from package import * 的時候, *可以導入的內容
'__init__.py' 中如果文件為空, 或者 沒有 '__all__',那么可以把 '__init__.py' 中的內容導入進去
'__init__.py' 如果設置了 '__all__' 的值 ,那么按照 '__all__' 指定的子包或者 模塊進行導入
如何則不會載入 '__init__.py' 中的全部內容
'__all__' = ['module', 'module1', 'module2', ......]
