zoukankan      html  css  js  c++  java
  • 自省和反射 动态导入模块

    自省和反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

     1 class BlackMeium:
     2     def __init__(self, name, addr):
     3         self.name = name
     4         self.addr = addr
     5 
     6     def sell_house(self):
     7         print('[%s] 正在卖房子,傻子才买' % self.name)
     8 
     9     def rent_house(self):
    10         print("[%s] 正在租房子,傻子才租" % self.name)
    11 
    12 
    13 b1 = BlackMeium('万成置地', '湾路缘')
    14 print(hasattr(b1, 'name'))
    15 print(hasattr(b1, 'addr'))
    16 print(hasattr(b1, 'sell_house'))  # 表示检测能不能调用到这个函数属性
    17 print(getattr(b1, 'name'))  # 没有就报错  可以添加一个参数,让其不报错
    18 print(getattr(b1, 'sell_house'))
    19 obj = getattr(b1, 'sell_house')  # 获取函数的地址
    20 obj()  # 地址加上括号,运行函数
    21 # getattr(x,'y')  # 相当于x.y
    22 # b1.sb = True
    23 print(b1.__dict__)
    24 setattr(b1, 'sb', True)
    25 setattr(b1, 'name', 'SB')
    26 print(b1.__dict__)
    27 del b1.name
    28 delattr(b1, 'sb')
    29 print(b1.__dict__)
    30 输出:
    31 True
    32 True
    33 True
    34 万成置地
    35 <bound method BlackMeium.sell_house of <__main__.BlackMeium object at 0x009B1FD0>>
    36 [万成置地] 正在卖房子,傻子才买
    37 {'name': '万成置地', 'addr': '湾路缘'}
    38 {'name': 'SB', 'addr': '湾路缘', 'sb': True}
    39 {'addr': '湾路缘'}
     1 f1 = FtpClient('192.168.1.1')
     2 if hasattr(f1, 'get'):
     3     func_get = getattr(f1, 'get')
     4     func_get()
     5 else:
     6     print('----->不存在此方法')
     7     print('处理其他的逻辑')
     8 # 可插拔式设计
     9 module = __import__('m1.t')  # 只能调用最顶级的模块,不能导入私用属性
    10 import importlib
    11 
    12 m = importlib.import_module('m1.t')  # 可以直接导入m1.t模块
    13 module.t.test()  # 这样才能进行调用
  • 相关阅读:
    可变形参 Day07
    流程控制 Day06
    基本数据类型的值传递 和引用数据类型的引用传递 Day06
    一维数组的求平均成绩 Day06
    一维数组的初始化及遍历 Day06
    字符串分割+二维数组 Day15练习
    Java对数组和列表的排序1.8新特性
    Java Stream
    JPA学习(六、JPA_JPQL)
    JPA学习(五、JPA_二级缓存)
  • 原文地址:https://www.cnblogs.com/ch2020/p/12434888.html
Copyright © 2011-2022 走看看