博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

python反射的妙用

Posted on 2016-03-01 16:34  善恶美丑  阅读(292)  评论(0编辑  收藏  举报

反射的简单含义:

  通过类名获得类的实例对象

  通过方法名得到方法,实现调用

实例:

import sys
class Webserver(object):
    def __init__(self,host,port):
        self.host = host
        self.port = port
    def start(self):
        print('Server is starting...')
    def stop(self):
        print('Server is stoping...')
    def restart(self):
        self.stop()
        self.start()
        print('Server is restarting')
def test(ins,name): # ins这里类似于self
    print('test...')
    ins.stop()
if __name__ == "__main__":
    server = Webserver('local',333)
    if hasattr(server,sys.argv[1]):  #返回对象是否具有给定名称的属性。
        func = getattr(server,sys.argv[1]) #从一个对象获得命名属性;getattr(x,y)相当于x.y。
        func()
    setattr(server,'test_run',test)   #  将函数test方法加入到类Webserver里(实例化中的方法,而不是类方法) server为实例名称,test_run为加入到类下的方法名称 test为要加入到类中的方法(注意:test_run存储在实例中)
    server.test_run(server,'name') # 将单独的方法加入到类中,方法内向调用类中的其他方法必须传入实例
    if sys.argv[1] == 'restart':
        server.restart()
    #------------------------------删除方法,传入实例的话不能删除类下的普通方法,只能删除静态方法或者通过setattr增加的方法(传入类名,可删除类下的方法)
    print(server.host)
    delattr(server,'host')
    print(server.host)     #>>正确

    server.test_run(server,'name')
    delattr(server,'test_run')
    server.test_run(server,'name')    #>>正确

    server.start()
    delattr(server,'start')
    server.start()    #>>错误