本节内容

1、概述

2、知识回顾

3、动态导入模块

一、概述

  我们之前导入模块都是用import,或者from ... import ....这种模式去导入模块,那如果我们如何实现只用字符串就可以导入模块呢?我们下面就来说说如何动态导入模块,这个东西还是蛮有用的,通过字符串就可以导入,很方便。

二、知识回顾

静态方法:

  与类无关,不能访问类里的任何属性和方法

类方法:

  只能访问类变量

属性(@property):

  把一个方法变成一个静态属性,例:flight.status->@status.setter->flight.status = 3->@status.delter

反射:

  getattr(obj,str),hasattr(obj,str),setattr(obj,str),delattr(obj,str)

三、动态导入模块

前置条件:需要导入的模块的目录结构

3.1、__import__方式

说明:这种方式只能到第一层级别

1
2
3
4
5
6
7
8
9
mod = __import__("lib.aa")
print(mod)  #打印模块信息
c_instance = getattr(mod.aa,"C")#或者写成c_instance = mod.aa.C()
c_obj = c_instance()
print(c_obj.name)
 
#输出
<module 'lib' from 'D:\\PycharmProjects\\pyhomework\\day8\\回顾上节\\lib\\__init__.py'#只导入lib级别
zhangqigao

3.2、importlib方式

说明:这种方式比较好,也是官方推荐的,它能助学导入到最后一个层级,就是你导入的哪个模块就到哪个层级

1
2
3
4
5
6
7
8
9
10
import importlib
mod = importlib.import_module("lib.aa")
print(mod)  #打印导入模块信息
c_instance = mod.C #又可写成 c_instance = getattr(mod,"C")
c_object = c_instance()
print(c_object.name)
 
#输出
<module 'lib.aa' from 'D:\\PycharmProjects\\pyhomework\\day8\\回顾上节\\lib\\aa.py'>#到aa.py级别
zhangqigao

总结:

  1. __import__方式是python内置函数,是python自己用的,而且知道第一层,所以极力不推荐
  2. importlib这种方式是官方推荐的,用起来比较简单,而且导入到那哪里就到哪里,极力推荐

面向对象【day08】:动态导入模块(八)的更多相关文章

  1. 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块

    1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...

  2. Python 动态导入模块

    动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │   └── aa.py ├── test1.py lib目录下 ...

  3. Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

    实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...

  4. Python3学习之路~7.4 动态导入模块

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块. 准备: 首先创建一个模块目录lib,然后在目录内创建一个模块 aa.py: # aa.pyclass C: def __ini ...

  5. Python importlib(动态导入模块)

    使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...

  6. python------Socket网略编程+动态导入模块

    上节课程回顾: 静态变量:与类无关,不能访问类里的任何属性和方法. 类方法:只能访问类变量. 属性:把一个方法变成静态属性, 反射: __new__:先于__init__执行: __call__: c ...

  7. 动态导入模块:__import__、importlib、动态导入的使用场景

    相关内容: __import__ importlib 动态导入的使用场景 首发时间:2018-02-23 16:06 __import__: 功能: 是一个函数,可以在需要的时候动态导入模块 使用: ...

  8. python 反射 动态导入模块 类attr属性

    1.反射 hasattr getattr delattr setattr 优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口, 然后是再去 ...

  9. Python3 动态导入模块的两种方式

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块 需要导入的模块: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:C ...

随机推荐

  1. 获取SpringMVC所有的rest接口及其对应函数信息

    package com.geostar.gfstack.operationcenter.core.cloud.action; import com.geostar.gfstack.operationc ...

  2. DRF 版本和认证

    Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...

  3. UOJ275 [清华集训2016] 组合数问题 【Lucas定理】【数位DP】

    题目分析: 我记得很久以前有人跟我说NOIP2016的题目出了加强版在清华集训中,但这似乎是一道无关的题目? 由于$k$为素数,那么$lucas$定理就可以搬上台面了. 注意到$\binom{i}{j ...

  4. Git回滚代码暴力法

    Git回滚有多种方式,这里使用的是[强制提交到远程分支] 效果为:如回滚前的提交记录是 1.2.3.4,使用这种方法回滚到2,那么提交记录就变成了1.2. 操作方法: 需要在本地的Git仓库,右键选择 ...

  5. DevOps 10秒钟进阶大师之路

    简介:DevOps(Development开发和Operations运维的组合词),是一种文化.原则.思维.理念.组织. DevOps 是一个完整的面向开发.运维的工作流,以 IT 自动化以及持续集成 ...

  6. 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)

    hdu 4658 Integer Partition 题意 n分拆成若干个正整数的和,每个正整数出现小于k次,分拆方案有多少.(t<=100,n<=1e5) 题解 之前写过一篇Partit ...

  7. Windows server install mrtg

    由于MRTG使用Perl语言编写 , 安装ActivePerl http://downloads.activestate.com/ActivePerl/releases/5.20.1.2000/Act ...

  8. Java和操作系统交互细节

    结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. enter image des ...

  9. Logger.error方法之打印错误异常的详细堆栈信息

    一.问题场景 使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便. 二.先放出结论 Logger类下有多个不同的error方法,根据传入参数的 ...

  10. Mysql连接报错:1130 - Host ‘118.111.111.111’ is not allowed to connect to this MariaDB server

    这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户),下面将记录我遇到问题的过程及解决的方法. 在搭建完LNMP环境后用Navicate连接出错 遇到这个问题 ...