• 反射


    导入模块常见的几种形式

    1 def f1():
    2     print("F1")
    3 
    4 def f2():
    5     print("F2")
    test1
    1 import test1
    2 test1.f1()
    3 
    4 from test1 import f1
    5 f1()
    6 
    7 from test1 import f1 as new_f1
    8 new_f1()
    test

    如何用字符串来导入模块呢,这里我们需要内置函数__import__

    #根据字符串导入模块
    c = __import__("test1")
    c.f1()
    #如果要导入from foo import base该如何操作呢?
    b = __import__('foo.base')
    print(b)
    结果:
    <module 'foo' from 'D:\python_work\elective_system\foo\__init__.py'>
    #发现只导入到foo这里,这里我们需要加个fromlist参数
    b = __import__('foo.base',fromlist=True)
    print(b)
    结果:
    <module 'foo.base' from 'D:\python_work\elective_system\foo\base.py'>
    此时就是我们想要结果了
    

    不过官方建议用b = importlib.import_module("lib.base"),需先导入importlib模块。这句等同于__import__('foo.base',fromlist=True)

    那么如何根据字符串在模块中寻找方法或则属性(这个是类的叫法,或则这里你可以叫全局变量和函数)呢?这里需要用到内置函数getattr

    c = __import__("test1") #根据字符串导入模块
    func = getattr(c,'f3') #根据字符串在模块中寻找函数
    func()       #执行函数

    #getattr还有第三个参数

    c = __import__("test1")
    getattr(c,"f3")
    #如果模块中没有f3方法或则属性,则会报错

    c = __import__("test1")
    func = getattr(c,"f3",None)#加一个参数None
    print(func)
    结果:
    None
    
    

    如何判断一个属性或则方法是否存在?使用内置函数hasattr

    c = __import__("test1")
    
    print(hasattr(c,"f3"))
    print(hasattr(c,"f1"))
    结果:
    False
    True

    应该还有设置属性或则方法,使用内置函数setattr

    c = __import__("test1")
    
    print(hasattr(c,"f3"))
    setattr(c,"f3","F3")
    print(hasattr(c,"f3"))
    结果:
    False
    True

    删除属性或则方法,使用内置函数delattr

    c = __import__("test1")
    
    print(hasattr(c,"f1"))
    delattr(c,"f1")
    print(hasattr(c,"f1"))
    结果:
    True
    False 

    上面这些就是反射的用法,反射的定义就是通过字符串映射或修改程序运行时的状态、属性、方法

    在类中的使用

    def sleep(self):
        print("%s is sleeping"%self.name)
    
    class Role(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print("%s is eating..."%self.name)
    
        def run(self):
            print("%s is runing..."%self.name)
    
    d = Role("lxj")  #实例化
    choice = input(">>").strip()  #输入方法
    
    if hasattr(d,choice):  #判断属性或则方法是否存在
    
        func = getattr(d,choice)  #获得属性或则方法,属性直接返回值,方法返回是内存地址
        if callable(func):   #判断是否可调用
            func()    #方法调用
        else:
            print(func)
    else:
        # setattr(d,choice,sleep)   #设置一个方法
        # d.sleep(d)
    
        setattr(d,choice,27)     #设置一个属性
        print(getattr(d,choice))
    

      

      

  • 相关阅读:
    脚手架自建从开始到发布
    零散点总结
    2019.3.7 chrome72下载图片卡死问题
    2019.2.18 一九年的新篇章
    2018.10.12 布局终结
    2018.7.23 放大缩小菜单
    2018.7.19 横向收缩菜单动画
    2018.6.8 openlayers.js学习(汇总)
    Elasticsearch 排序
    easyui tree树节点上移下移 选中节点加背景色
  • 原文地址:https://www.cnblogs.com/zj-luxj/p/7082162.html
Copyright © 2020-2023  润新知