一、模块
模块 就是程序,以*.后缀,里面包含函数、变量、类,执行代码。导入多次和导入一次效果是一样的,模块是用来定义的,导入模块并不会执行里面的代码。
1.1 导入模块方式
导入模块的⽅方式
import 模块名
from 模块名 import 方法名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 方法名 as 别名
如果导入多个模块中有相同的方法,需要使用 "from 模块名 import 方法名 as 别名" 创建别名
1.2 模块搜索顺序
当导入一个模块, Python解析器对模块位置的搜索顺序
1.当前目录
2.如果不在当前目录, Python则搜索在shell变量PYTHONPATH下的每个目录。
3. 如果都找不到, Python会察看默认路径。 UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路路径存储在system模块的sys.path变量中。变量里包含当前目录, PYTHONPATH和由安装过程决定的默认目录。
import sys
import pprint
pprint.pprint(sys.path)
['F:\\PythonPro',
'F:\\PythonPro',
'D:\\Program_files\\Python37\\python37.zip',
'D:\\Program_files\\Python37\\DLLs',
'D:\\Program_files\\Python37\\lib',
'D:\\Program_files\\Python37',
'F:\\PythonPro\\venv',
'F:\\PythonPro\\venv\\lib\\site-packages',
'F:\\PythonPro\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.7.egg',
'F:\\PythonPro\\venv\\lib\\site-packages\\pip-19.0.3-py3.7.egg']
1.3 只允许某些函数被导入
如果模块文件中有 __all__ 变量,当使⽤用 " from 模块名 import * " 导入时,只能导入__all__ 包含的方法.
" import 模块名 " 导入时,仍然可以使用 模块名.方法名 来访问方法
定义模块 testmodule.py
__all__ = ['testA']
def testA():
print('testA')
def testB():
print('testB')
导入模块
import testmodule
testmodule.testA() #testA
testmodule.testB() #testB
from testmodule import *
testA()
testB()
#输出
Traceback (most recent call last):
File "F:/PythonPro/main.py", line 3, in <module>
testB()
NameError: name 'testB' is not defined
testA
二、包
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为 __init__.py ⽂文件,那么这个文件夹就称之为包
导入包:
import 包名.模块名
from 包名 import *
可指定包哪些模块可以被导入, 可以在包文件夹下的 __init__.py 中添加 ,(from 包名 import * 只能导入__all__包含的模块)
__all__ = [] :允许导⼊入的模块或功能列列表
如果希望在包中设置一些常数,可以吧长度定义在 __init__.py 中
三、 探索模块中有什么东东
3.1 dir(name)
name可以是包名或者模块名,返回参数的属性、方法列表
import abc
moduleContent=[n for n in dir(abc)]
print(moduleContent)
['ABC', 'ABCMeta', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_abc_init', '_abc_instancecheck', '_abc_register', '_abc_subclasscheck', '_get_dump', '_reset_caches', '_reset_registry', 'abstractclassmethod', 'abstractmethod', 'abstractproperty', 'abstractstaticmethod', 'get_cache_token']
有几个以下划线打头,它们并非供外部使用,可以过滤掉这些属性和方法
import abc
moduleContent=[n for n in dir(abc) if not n.startswith('_')]
print(moduleContent)
['ABC', 'ABCMeta', 'abstractclassmethod', 'abstractmethod', 'abstractproperty', 'abstractstaticmethod', 'get_cache_token']
3.2 __all__
__all__ 提供公有的接口,from copy import * 只能导入__all__ 定义的类 和方法、属性
如果模块没有提供_all__ 将导入全部不以__到头的的变量,函数和类,然而有些是不需要的
3.3 __doc__
可以通过 模块名.__doc__ 查看 该模块的相关文档
import abc
print(abc.__doc__)
#Abstract Base Classes (ABCs) according to PEP 3119.
3.5 __file__
可以通过 模块名.__file__ 查看 该模块的所在路径
import abc
print(abc.__file__)
#D:\Program_files\Python37\lib\abc.py
3.5 __dict__
只有类 才会有__dict__属性, 类__init__ 中声明的 属性 通常存储在__dict__中,并以字典方式进行存储
class person(object):
def __init__(self,name,age,phonenum):
self.name = name
self.age = age
self.phonenum = phonenum
def get_name(self):
return self.name
per1=person('xiaoming',22,'123456')
print(person.__dict__)
print(per1.__dict__)
#{'__module__': '__main__', '__init__': <function person.__init__ at 0x0000023098ED60D8>, 'get_name': <function person.get_name at 0x0000023098ED6168>, '__dict__': <attribute '__dict__' of 'person' objects>, '__weakref__': <attribute '__weakref__' of 'person' objects>, '__doc__': None}
#{'name': 'xiaoming', 'age': 22, 'phonenum': '123456'}
类名.__dict__ 包含了许多东西,而实例 只以字典形式 包含了 属性名 及它的值
继承下的__dict__
class CLanguage:
a = 1
b = 2
def __init__(self):
self.name = "C++语言中文网"
self.add = "C++"
class CL(CLanguage):
c = 1
d = 2
def __init__(self):
super().__init__()
self.name = "Python教程"
self.add = "Python"
self.phone='123456'
clangs = CLanguage()
print(clangs.__dict__)
cl = CL()
print(cl.__dict__)
#{'name': 'C++语言中文网', 'add': 'C++'}
#{'name': 'Python教程', 'add': 'Python', 'phone': '123456'}
可以看出,子类并不会影响父类。子类改变了属性,增加了属性,__dict__也会体现出来