zoukankan      html  css  js  c++  java
  • 反射功能:***attr

    python 面向对象中的反射:通过字符串的形式操作对象相关的属性。Python中的一切事物都是对象(都可以使用反射)

    python中反射功能是由四个内置函数提供:hasattr, getattr, setattr, delattr

    该四个函数分别用于对 对象内部执行:检查是否含有成员,获取成员,设置成员,删除成员。

    class Foo(object):
    
        def __init__(self):
            self.name = 'tom'
    
        def func(self):
            return 'func123'
    
    obj = Foo()
    
    
    #-------检查是否含有成员
    hasattr(obj,'name')      #print ---> True
    hasattr(obj,'func')      #True
    
    
    
    #-------获取成员
    getattr(obj,'name')
    getattr(obj,'func')
    
    
    
    #-------设置成员
    setattr(obj,'age',20)
    setattr(obj,'show',lambda num:num + 1)
    
    
    # print(obj.age)     #20
    # print(obj.show(2))   #3
    
    
    
    
    #-------删除成员
    delattr(obj,'name')
    delattr(obj,'func')
    
    
    # print(obj.name)    #报属性错误
    # print(obj.func())    #报属性错误
    

     详细解析:

    class Foo(object):
        role = '地球人'
    
        def __init__(self, name):
            self.name = name
    
        def func(self):
            return 'func123'
    
    
    obj = Foo('Tom')
    obj2 = Foo('jack')
    
    print(obj.name)
    print(obj2.name)
    print(obj.func())

    解析开始:

    class Foo(object):
    
        def __init__(self):
            self.name = '汤姆'
    
        def func(self):
            return 'func123'
    
    obj = Foo()
    
    
    #访问字段
    obj.name
    
    #执行方法
    obj.func()
    

    a.上述访问对象成员的 name 和 func 是什么?

    答:是变量名

    b. obj.xxx是什么意思?

    答:obj.xxx 表示去obj中或类中寻找 变量名xxx, 并获取对应内存地址中的内容。

    c.需求:使用其他方式获取obj对象中的name变量指向 内存中的值“汤姆”

    *****  不允许使用 obj.name 

    答:两种方式

    class Foo(object):
    
        def __init__(self):
            self.name = '汤姆'
    
        def func(self):
            return 'func123'
    
    obj = Foo()
    
    
    print(obj.__dict__['name'])
    方式一
    class Foo(object):
    
        def __init__(self):
            self.name = '汤姆'
    
        def func(self):
            return 'func123'
    
    obj = Foo()
    
    
    print(getattr(obj,'name'))
    方式二

     

    from wsgiref.simple_server import make_server
    
    class Handler(object):
    
        def index(self):
            return 'index'
    
        def news(self):
            return 'news'
    
    
    def RunServer(environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
        temp = url.split('/')[1]
        obj = Handler()
        is_exist = hasattr(obj, temp)
        if is_exist:
            func = getattr(obj, temp)
            ret = func()
            return ret
        else:
            return '404 not found'
    
    if __name__ == '__main__':
        httpd = make_server('', 8001, RunServer)
        print "Serving HTTP on port 8000..."
        httpd.serve_forever()
    Web框架实例

     结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!

    import sys
    
    def s1():
        print('s1')
    
    def s2():
        print('s2')
    
    
    this_module = sys.modules[__name__]
    
    print(hasattr(this_module,'s1'))   #True
    print(hasattr(this_module,'s2'))   #True
    反射当前模块成员

     类也是对象

    class Foo(object):
    
        role = '地球人'
    
        def __init__(self):
            self.name = 'Tom'
    
        def func(self):
            return 'func'
    
        @staticmethod
        def bar():
            return 'bar'
    
    
    print(getattr(Foo,'role'))
    print(getattr(Foo,'func'))
    print(getattr(Foo,'bar'))
    

    模块也是对象

    home.py

    def to_im():
    
        return 'To be imported'
    
    """
    程序目录:
        home.py
        index.py
     
    当前文件:
        index.py
    """
    
    
    import home as obj
    
    #print(obj.to_im())
    
    
    
    func = getattr(obj,'to_im')
    func()
    
  • 相关阅读:
    Oracle 循环语句
    IDEA---SpringBoot同一个项目多端口启动
    Maven引入oracle驱动包
    Linux安装 PostgreSQL
    Oracle备份及备份策略
    Oracle优化的几个简单步骤
    Oracle RMAN备份策略
    常见的几种索引扫描类型
    插槽内容
    分布式系统session同步解决方案
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7688427.html
Copyright © 2011-2022 走看看