Hello World

反射功能:***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()

 

posted @ 2017-10-18 19:34  nayike  阅读(174)  评论(0编辑  收藏  举报

Hello