一、什么是模块(Module)
在Python中,模块是一种包含变量、函数和类等定义的.py文件。模块可以是标准库中提供的模块,也可以是其他开发者创建的自定义模块。
模块的优点:
- 代码复用:用于组织和重用代码,让代码更有组织性和可维护性。
- 提供命名空间:模块提供了一个独立的命名空间,可以避免命名冲突。不同模块中的变量、函数和类可以具有相同的名称,而不会相互干扰。
二、模块的使用
- 通过import关键字导入模块
#方法一:import 模块名;模块名.功能
import math
print(math.sqrt(9))
#方法二:from 模块名 import 功能1,功能2;功能调用(不需要书写模块名.功能)
from math import sqrt
print(sqrt(9))
#from 模块名 import *;功能调用(不需要书写模块名.功能)
from math import *
print(sqrt(9))
- 通过as关键字给模块起别名
#模块定义别名
import time as tt
tt.sleep(2)
print('hello world')
#功能别名
from time import sleep as sl
sl(2)
print('hello world')
- 调用自己制作的模块
- 在my_module1.py文件中定义一个testA()函数
def testA(a,b):
print(a + b)
'''
`__name__` 是一个特殊的内置变量。当一个模块被直接运行时,`__name__` 的值为 `'__main__'`。
如果模块是被其他模块引入的,那么 `__name__` 的值就会是那个模块的名字。这个特性通常用于判断一个
模块是被直接运行还是被导入的。
'''
#这里的代码只有在文件被直接运行时才会执行
if __name__ == '__main__':
- 调用my_module1模块
import my_module1
my_module1.testA(3,6 )
- 模块的定位顺序
#1、自己的文件名不要和已有模块名重复,否则会导致模块功能无法使用
'''
当导入一个模块时,Python解析器的搜索顺序是:
1. 当前目录
2. 如果不在当前目录,Python会在shell变量PYTHONPATH下的每个目录中查找。
3. 如果都找不到,Python会查看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/。
4. 模块的搜索路径存储在系统模块sys的sys.path变量中。这个变量包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
'''
import random
#AttributeError: module 'random' has no attribute 'randint'
# numbers = random.randint(1,10)
# print(numbers)
#2、当使用from xx import function 导入模块的功能的时候,如果功能名字重复,调用到的是最后定义或导入的功能
def sleep():
print('我是自定义的slepp')
from time import sleep
sleep(2)
三、导入包
包:在Python中,包(Package)是一种组织和管理模块(Module)的方式。包是一个包含多个模块的文件夹,文件夹中必须包含一个名为__init__.py
的文件,用于将文件夹标识为一个包。
#方法一
'''
1、导入
import 包名.模块名
2、调用功能
包名.模块名.功能()
'''
import my_package.my_module1
my_package.my_module1.print_info()
#方法二
'''
注意:必须在__init__.py文件中添加__all__=[],控制允许导入的模块列表
from 包名 import *
模块名.目标
'''
from my_package import *
my_module1.print_info()
四、作用域
在Python中,作用域指的是变量和函数的可访问范围。这可以通过命名规则来实现。
- 公开的函数和变量可以直接引用,其名称没有特殊的前缀。
- 以双下划线(__)开头和结尾的特殊变量是可以直接引用的,但它们有特殊的用途,比如
__author__
、__name__
等。 - 以单下划线(_)开头的函数或变量是非公开的,不应该被直接引用,例如
_abc
、__abc
等。
尽管Python没有一种方法可以完全限制访问非公开函数或变量,但从编程习惯上来说,不应该直接引用非公开函数或变量。
class Prentice(object):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
#定义私有属性
self.__money = 200000
#定义私有方法
def __print_info(self):
print('这是私有方法')
#获取私有属性:get_X
def get_money(self):
return self.__money
#修改私有属性:set_XX
def set_money(self):
self.__money = 500
#创建徒孙类
class Tusun(Prentice):
pass
muxi = Tusun()
#调用get_money函数获取私有属性money的值
print(muxi.get_money())
#调用set_money函数修改私有属性money的值
muxi.set_money()
#调用get_money函数获取私有属性money的值
print(muxi.get_money())
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。