zoukankan      html  css  js  c++  java
  • python反射的妙用

    反射的简单含义:

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

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

    实例:

    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()    #>>错误
  • 相关阅读:
    ASP.Net如何用Cookies保存对象
    MS SQL语句优化
    服务消费者
    [模板]线性筛素数(欧拉筛法)
    luogu4159 迷路 (矩阵加速)
    poj1845 sumdiv (因数的和)
    luogu3674 小清新人渣的本愿 (bitset+莫队)
    luogu3621 城池攻占 (倍增)
    luogu3233 世界树 (虚树)
    bzoj4540 序列 (单调栈+莫队+rmq)
  • 原文地址:https://www.cnblogs.com/Chen-PY/p/5231113.html
Copyright © 2011-2022 走看看