面向对象进阶之反射

一 反射

 

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框架实例
#结论:
反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!

 

二  类也是对象

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 @ 2018-04-27 18:06  shadow3  阅读(120)  评论(0)    收藏  举报