zoukankan      html  css  js  c++  java
  • 面向对象的反射&动态导入模块

    反射的四个机制 hasattr getattr setattr delattr 具体实现代码如下

     1 class People:
     2     def __init__(self,name,age,id):
     3         self.name=name
     4         self.age=age
     5         self.id=id
     6 
     7     def play(self):
     8         print('%s现在开始玩游戏了,告诉我你的ID%s'%(self.name,self.id))
     9 
    10     def sleep(self):
    11         print('%s ,不早了,赶快休息哦!'%self.name)
    12 
    13 p1=People('小婉',18,429006)
    14 p1.play()
    15 p1.sleep()
    16 print(hasattr(p1,'name')) #检查对象里是否含有name这个属性 有则为TRUE
    17 print(getattr(p1,'age233','找不到这样的元素')) #检查对象里是否含有name这个属性 有则为获取,无则返回默认设置的字符串
    18 sp1=setattr(p1,'sex','woman') #向对象里添加指定属性(键值对形式)
    19 print(p1.__dict__)
    20 delattr(p1,'sex')  #删除指定对象属性 以key为主
    21 
    22 print(p1.__dict__)

     

    1 import sys
    2 name='lisa'
    3 def say():
    4     print('hello python')
    5 
    6 print(sys.modules['__main__'].name)
    7 print(getattr(sys.modules['__main__'],'name'))     #属性
    8 getattr(sys.modules[__name__],'say')()             #方法

    反射自己模块中的属性变量sys.modules[''__main__"]

    反射自己模块中的方法函数sys.modules[__name__]

    *************************************************************************************************

    动态导入模块,解析字符串 __import__

     1 # from src import Student
     2 from src.Student import _Room #私有类也可以直接导入类名后调用
     3 # im=__import__('src.Student')  #动态导入模块 解析出字符串src
     4 # print(im)
     5 # p=im.Student.People('小芬',21,520) #所以对应为srcStudentPeople类
     6 # p.play()
     7 
     8 # r1=im.Student._Room('小马','20',11,13,5)
     9 r1=_Room('小马','20',11,13,5)
    10 print(r1.name)

     类的内置函数

    __getattr__
    __delattr__
    __setattr__
     1 class Fun:
     2     wt='func'
     3     def __init__(self,name,age):
     4         self.name=name
     5         self.age=age
     6 
     7     # def __getattr__(self, item): #找不到对象属性时会触发
     8     #     print('----->执行getattr中')
     9 
    10     # def __delattr__(self, item):  #删除属性或类时会触发
    11     #     print('------>执行delattr中')
    12 
    13     def __setattr__(self, key, value): #设置属性或类时会触发
    14         self.__dict__[key] = value
    15         print('------>执行setattr中')
    16 
    17 f1=Fun('小马',18)
    18 print(f1.name)
    19 f1.sex='woman'
    20 print(f1.__dict__)
    21 # del f1.name
    22 # del f1.wt

     数据的包装(授权) 把句柄赋给一个字段属性(组合) 通过重写类方法来自定义函数,以达到方法的目的

     1 class Open:
     2     '文件打开类'
     3     def __init__(self,filename,model,enc):
     4         self.filename=open(filename,model,encoding=enc)
     5         self.model=model
     6         self.encoding=enc
     7 
     8     def read(self):
     9        return getattr(self.filename,'read')
    10 
    11     def write(self,say):
    12         t=time.strftime('%Y:%m:%d:%X')
    13         self.filename.write(t +say+'
    ')
    14 
    15     # def __getattr__(self, item):
    16     #     return getattr(self.filename,item,'找不到这样的属性')
    17 
    18 p1=Open('abc.txt','a+','utf-8')
    19 p1.write('CPU空间不足')
    20 p1.write('硬盘空间不足')
    21 p1.write('内存空间不足')
    22 p1.write('ftp空间不足')
    23 
    24 # print(p1.read123)
    25 # print(p1.read()())
    26 # p1.write()
  • 相关阅读:
    SSH批量部署服务
    rsync配置
    你到底有没有资本
    QT4.8.5 源码编译记录
    kernel 4.4.12 移植 HUAWEI MU609 Mini PCIe Module
    AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备
    u-boot bootz 加载kernel 流程分析
    Linux kernel 之 socket 创建过程分析
    Linux kernel 之 uart 驱动解析
    am335x 无屏实现开关机程序
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9247036.html
Copyright © 2011-2022 走看看