zoukankan      html  css  js  c++  java
  • 反射

     

    反射

    什么是反射?

    • 本质上就是通过字符串对对象进行操作

    常用:

    • hasattr(object, name)
      • 判断name是否是object的属性,返回一个布尔值。
      • name必须是字符串,object可以是任何有方法的对象,包括:类、类的实例、模块。
    • getattr(object, name[, default])
      • 调用object的name属性或者方法,失败时返回default
      • 通常和hasattr方法连用
        class Foo:
            f = '类的静态字段'
      	
            def __init__(self, name):
                self.name = name
                self.common = '类的普通字段'
      	
            def say_hi(self):
                print('hi, %s' % self.name)
      	
        obj = Foo('jack')
      	
        # 判断是否含有某属性
        print(hasattr(Foo, 'f'))
        print(hasattr(obj, 'name'))
        print(hasattr(obj, 'say_hi'))
      	
        # 获取属性
        print(getattr(Foo, 'f'))
        print(getattr(obj, 'name'))
        getattr(obj, 'say_hi')()
      	
        print(getattr(obj, 'empty', "Does't exist."))
      
    • 关于模块

        import sys
        if hasattr(sys.modules[__name__], 'Foo'):
            getattr(getattr(sys.modules[__name__], 'Foo')('jack'), 'say_hi')()
      
    • 通过sys.moudules得到当前已加载的模块列表,使用__name__获取本文件的对象,判断是否有Foo属性,如果有则调用Foo属性并实例化出一个对象,调用对象的say_hi方法。

    不常用:

    • setattr(object, name, value)
      • getattr的一个变种,可以对object的name属性进行赋值操作
        setattr(obj, 'name', 'other')
        print(getattr(obj, 'name'))
      
      • 如果name属性不存在则会为其创建一个值为value的name属性
      • value可以是函数,包括另外定义的函数或者匿名函数,但是调用的时候必须要额外进行赋值操作
    • delattr(object, name)
      • 用于删除object的name属性,如不存在属性则报AttributeError
  • 相关阅读:
    js 实现树效果
    (转)JavaScript 冒泡实例与阻止冒泡方法
    (转)js全页面刷新方法
    js 右键菜单
    (转)js,jQuery屏蔽鼠标右与jquery 鼠标右键事件、左键单击事件判定
    Flex取xml文件中的值
    oracle相关时间计算,得到季度第一天、最后一天
    (转)ASP.NET MVC VS2010中更改默认调试浏览器
    JS 与 后台如何获取 Cookies
    js 弹出新页面
  • 原文地址:https://www.cnblogs.com/leiyiming/p/9194645.html
Copyright © 2011-2022 走看看