• python反射机制


    关于反射, 其实一共有4个函数:

    其中obj可以是模块或者是对象

    • hasattr(obj, str) 判断obj中是否包含str成员
      def hasattr(*args, **kwargs)
    • getattr(obj,str) 从obj中获取str成员
      def getattr(object, name, default=None): 如果没查找都内容,返回设置的默认值
    • setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这里的value可以是值, 也可以是函数或者方法
      def setattr(x, y, v):
    • delattr(obj, str) 把obj中的str成员删除掉
      def delattr(x, y):

                注意, 以上操作都是在内存中进行的. 并不会影响你的源代码

    在操作的对象是模块的时候:

    import gg #
    # #
    def dd():
        print('这就是我想改的 ')
    setattr(gg,'g4',dd)#将原来的函数修改为自动以的函数dd 》》类似于修改字典中的vaule
    print(gg.g4())#调用的时候还是使用原来的方式进行调用
    
    setattr(gg,'name','我的天啊')#同理这是对模块中的变量的修改
    print(gg.name)
    delattr(gg,'name') #同理这是对模块中的变量的删除   
    print(gg.name)
    #都不影响源码,都是修改内存上的内容,

    在对象中应用的时候用法基本相同,注意的是  创建的对象的属性都会存放在创建对象的开辟的内存位置,所有的方法会放在类的代码区,使用反射的时候对应进行使用就可以

    class Car:
        def __init__(self,color):
            self.color = color
    
        def fly(self):
            print('我的车真的会飞')
    
    gg = Car('黄色')
    if hasattr(gg,'color'):#通过hasattr判断熟悉你是否存在
        print(getattr(gg,'color')) #通过getattr获取属性的值
    if not hasattr(Car,'run'):#当不存在某个方法的时候,可以通过setattr去新建(setattr:存在就是修改,不存在就自动新建)
        setattr(Car,'run',lambda self,x:print('我的车还会跑%s'%x))
        gg.run('')
    if  hasattr(Car,'fly'):
        delattr(Car,'fly')
    if not  hasattr(Car,'fly'):
        print('fly 方法已经成功删除')
  • 相关阅读:
    LOJ #2109. 「JLOI2015」骗我呢 数形结合+组合+容斥
    LOJ #2729. 「JOISC 2016 Day 1」俄罗斯套娃 扫描线+贪心
    LOJ #2508. 「AHOI / HNOI2018」游戏 拓扑排序
    LOJ #2106. 「JLOI2015」有意义的字符串 构造+矩阵乘法
    LOJ #2471. 「九省联考 2018」一双木棋 记忆化搜索
    python的md5和base64加密
    [转]python的find()方法
    [转]python的startswith()方法
    获取http请求的响应状态
    with...as...用法
  • 原文地址:https://www.cnblogs.com/vivi0403/p/9936465.html
Copyright © 2020-2023  润新知