python基础____学习笔记8( 模块和包)

一、模块
模块 就是程序,以*.后缀,里面包含函数、变量、类,执行代码。导入多次和导入一次效果是一样的,模块是用来定义的,导入模块并不会执行里面的代码。
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__也会体现出来
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值