zoukankan      html  css  js  c++  java
  • Python概念-反射之文化底蕴版:反正射了

    什么是反射

    光在两种物质分界面上改变传播方向又返回原来物质中的现象,叫反射!

    以上,是反射的物理定义,与python中的反射概念,完全没有任何关系

    书归正传:反射

    就是通过字符串的形式,操作对象相关的属性

    反射的相关函数:

    hasattr(object,"name")
    #返回bool类型,判断object的命名空间中是否存在name这个名字
    #存在返回True
    #不存在返回Flase
    obj = getattr(object,"name")
    #获得Object中名称为name的内存地址
    #name可以是一个方法,也可以是一个属性
    setattr(Object,"name","egon")
    #在Object中添加一个name名字,并赋值egon
    #在Object的__dict__中就可以看到{"name":"egon"}了
    delattr(Object,"name")
    #在Object中删除名称为name的内存地址

    为什么要用反射,反射有什么优势

    实现可插拔机制

    例如:程序员A负责写模块,程序员B负责调用,当程序员A的模块没有完成,程序员B依然可以将代码完成,而且与程序员A的工作不相冲突

    代码示例:

    1 # 编辑者:闫龙
    2 class ftpc:
    3     def __init__(self,x):
    4         print("come no baby",x)
    5     def getFile(self):
    6         print("反正里面有文件")
    7     def upFile(self):
    8         print("你就当上传成功了一个叫FuckEgon的文件")
    程序员A的未完成模块
     1 # 编辑者:闫龙
     2 import FtpClient
     3 class FtpS:
     4     def __init__(self):
     5         print("服务端已开启")
     6     def Go(self):
     7         ftpc = FtpClient.ftpc("egon")
     8         while True:
     9             userin = input(">>>:")
    10             if(hasattr(ftpc,userin)):#在这里就是判断程序员A未完成的代码中是否存在某方法,如果存在则执行,不存在则提示指令错误
    11                 ftpp = getattr(ftpc,userin)
    12                 ftpp()
    13             else:
    14                 print("指令错误")
    15                 continue
    16 
    17 f = FtpS()
    18 f.Go()
    程序员B的实现

    动态导入模块

    我们在导入模块的时候会用到Import 模块名,而这个模块名并不是一个字符串,那么使用应的好处就是可以对应字符串转成相应的模块

    代码示例:

     1 #官方推荐版:egon坑货版
     2 import importlib #导入一个improtlib模块
     3 Choice = input(">>>")#获取用户输入的信息(模块名字)
     4 importlib.import_module(Choice)#将用户输入的字符串变成模块的名字并导入模块
     5 
     6 #矮根儿先入为主版:官方根本不推荐,但是如果你非要这么写的话,请在写之前注明:
     7 #<林海峰教的>
     8 Choice = input(">>>")#获取用户输入的信息(模块名字)
     9 __import__(Choice)#将用户输入的字符串变成模块的名字并导入模块
    10 #</林海峰教的>
  • 相关阅读:
    Vue 2.x windows环境下安装
    VSCODE官网下载缓慢或下载失败 解决办法
    angular cli 降级
    Win10 VS2019 设置 以管理员身份运行
    XSHELL 连接 阿里云ECS实例
    Chrome浏览器跨域设置
    DBeaver 执行 mysql 多条语句报错
    DBeaver 连接MySql 8.0 报错 Public Key Retrieval is not allowed
    DBeaver 连接MySql 8.0报错 Unable to load authentication plugin 'caching_sha2_password'
    Linux系统分区
  • 原文地址:https://www.cnblogs.com/DragonFire/p/6757432.html
Copyright © 2011-2022 走看看