美文网首页
【第37天】python全栈从入门到放弃

【第37天】python全栈从入门到放弃

作者: 36140820cbfd | 来源:发表于2019-08-29 17:29 被阅读0次

    1 模块的知识回顾

    1.模块不会被重复导入

    2,import导入一个模块(from import 的时候发生了什么)相当于执行这个模块

    3.模块有自己独立的命名空间

    4.模块的重命名as

    5.模块没导入之前在硬盘上,不在内存上

    2 导入模块的方法

    import 包.包.模块
    from 包.包.包 import 模块
    包.包.模块.变量
    模块.变量

    3 pyc编译文件和重新加载模块

    当一个文件作为一个脚本被导入的时候,就会在这个文件所在的目录的pycache下生成一个编译好的文件, 为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以,可以节省一些导入时候的时间,节省时间,提高效率

    4 运行py文件的两种方式(模块/脚本)

    以模块的形式运行

    代码块
    import  my_modules
    
    if __name__ == '__main__':
    
        my_modules.login('wangsiyu')
    
    print(__name__)
    

    以脚本形式运行,在pycharm中运行

    代码块
    那么需要在本文件中直接打印的代码上加上
    
     if __name__ == '__main__':
    
    在编写py文件的时候
    
    所有不在函数和类中封装的内容都应该写在
    
    if __name__ == '__main__':后面
    

    5 反射自己模块的变量

    代码块
    import sys
    
    name='wangsiyu'
    
    def login(name):
        print('hello',name)
    
    
    #利用反射拿到相关的变量
    res=getattr(sys.modules['__name__'],'login')
    res('nex'  )   #相当于利用反射调用login()函数   hello nex
    
    # import sys
    # 
    # getattr(sys.modules[__name__],变量名)
    

    6 怎样知道自定义模块是否可以被导入

    看sys.path当中 是否存在你要导入的文件 所在的目录,如果没有目录,可以把要执行文件目录添加到sys,path的列表中

    7 模块的导入层级

    模块的搜索路径全部存储在sys.path列表中

    如果要导入的模块和当前执行的文件同级

    直接导入即可

    如果要导入的模块和当前执行的文件不同级

    需要把要导入模块的绝对路径添加到sys.path列表中

    8 模块的重加载

    代码块
    import my_modules
    import importlib
    import time
    #在 import之后,再修改模块里面,程序感知不到。
    
    try:
        print(my_modules.name)  # 这个时候会报错,因为模块my_modules没有name
            # 如果这时候去my_modules去添加一个name呢?
    except AttributeError:
        print("module 'my_modules' has no attribute 'name'")
    
    time.sleep(10)  #暂停10秒
    #
    importlib.reload(my_modules)   #重加在这个模块,这个时候可以看到修改的模块了。
    print(my_modules.name)   #因为重新加载了,所以此时有了。
    

    9 总结

    9-1

    from 模块import 名字

    导入这个模块中的某个名字之后,这个名字就可以直接使用了

    名字是变量 直接用

    名字是函数 函数名()就是调用

    名字是类名 类名()就是实例化

    代码块
    from my_modules import name ,Student,login #导入变量,类,和函数
    
    print(name)   #调用变量
    
    #调用类
    s=Student()
    s.run()
    
    #调用函数
    login()
    

    9-2

    把模块当作脚本用。

    把模块当成脚本运行:

    你希望 某一段代码 在被当做模块导入的时候 不要执行

    就把它写在if name =='main':下面

    代码块
    def login():
        print('success')
    
    name=123
    
    # 你希望 某一段代码 在被当做模块导入的时候 不要执行
    # 
    # 就把它写在if __name__ =='__main__':下面
    
    #如果调用my_modules这个模块,那么Student这个类不能被调用
    if __name__ == '__main__':
    
        class Student:
            def __init__(self):
                pass
    
            def run(self):
                print('我可以奔跑')
    

    9-3

    sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径

    9-4

    如果是直接导入一个包,那么相当于执行了这个包中的init文件

    并不会帮你把这个包下面的其他包以及py文件自动的导入到内存

    如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用

    那么你要自己处理init文件,在文件中提前写好导入。

    别跑,点个赞再走

    相关文章

      网友评论

          本文标题:【第37天】python全栈从入门到放弃

          本文链接:https://www.haomeiwen.com/subject/wqniectx.html