zoukankan      html  css  js  c++  java
  • python之反射

    什么是反射?
    1、有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断。判断是否存在字符串对应的变量及方法。
    2、我们知道访问变量时是不能加引号的,否则会被当成字符串处理。如果要通过字符串找到对应的变量,那该怎么办呢

    反射就是用于解决上面两个问题而产生的,所谓反射,按我的理解就是反过来告诉我字符串是什么,是变量or方法

    python中访问类或对象的成员有三种方法
    ##如下所示 obj 为对象 var为变量 func为函数
    1、obj.var 或 obj.func()
    2、obj.__dict__['var']
    3、getattr(obj,'var')

    反射有4个方法 getattr() hasattr() setattr() delattr()

    举例子如下,一目了然

    class A(object):
        gvar = 'min'
        def __init__(self,name,male):
            self.name = name
            self.male = male
        def func1(self):
            print "func1 :my name is %s" % self.name
        def func2(self):
            print "func2 :I'm a %s" % self.male
    
    ##实例化对象
    obj = A('min','girl')
    hasattr(obj,'gvar')
    hasattr(obj,'func1')
    getattr(obj,'gvar')
    getattr(obj,'name')
    getattr(obj,'func1')
    getattr(obj,'func2')()
    setattr(obj,'gvar','ben')
    getattr(obj,'gvar')
    delattr(obj,'gvar')
    ##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
    getattr(A,'func2')
    hasattr(A,'func1')
    示例代码

    #当某个字符串就是模块名时,我们导入模块时可以用以下方法导入
    mymodule = __import__(var) #这个就相当于导入模块var.py了

    导入后,你可以在你的代码中用mymodule.*来调用该模块下的任意方法

     1 >>> class A(object):
     2 ...     gvar = 'min'
     3 ...     def __init__(self,name,male):
     4 ...         self.name = name
     5 ...         self.male = male
     6 ...     def func1(self):
     7 ...         print "func1 :my name is %s" % self.name
     8 ...     def func2(self):
     9 ...         print "func2 :I'm a %s" % self.male
    10 ... 
    11 >>> ##实例化对象
    12 ... obj = A('min','girl')
    13 >>> hasattr(obj,'gvar')
    14 True
    15 >>> hasattr(obj,'func1')
    16 True
    17 >>> getattr(obj,'gvar')
    18 'min'
    19 >>> getattr(obj,'name')
    20 'min'
    21 >>> getattr(obj,'func1')
    22 <bound method A.func1 of <__main__.A object at 0x7f7b89f99a50>>
    23 >>> getattr(obj,'func2')()
    24 func2 :I'm a girl
    25 >>> setattr(obj,'gvar','ben')
    26 >>> getattr(obj,'gvar')
    27 'ben'
    28 >>> delattr(obj,'gvar')
    29 >>> ##python中一切事物都是对象,故其实上面的obj也是可以是类名,模块名
    30 ... getattr(A,'func2')
    31 <unbound method A.func2>
    32 >>> hasattr(A,'func1')
    33 True
  • 相关阅读:
    ASP.NET缓存全解析(系列)
    updateprogress用法技巧
    text与img对齐
    9款Firefox插件提高设计开发效率
    ASP.NET页面实时进行GZIP压缩优化
    如何收缩和删除SQL日志文件
    闲扯加班
    与大家分享一点游戏管理晋升的心得(完整版)
    FDS (Flex Data Services)
    和我老婆去旅游
  • 原文地址:https://www.cnblogs.com/benric/p/5069205.html
Copyright © 2011-2022 走看看