zoukankan      html  css  js  c++  java
  • python(7)– 类的反射

    python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

    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 stopping....")
    
        def restart(self):
            self.stop()
            self.start()
    
    #在类外面定义一个函数
    def test_run(name):
        print("running...", name)
    
    if __name__ == "__main__":
        server = WebServer("localhost", 22)
        server1 = WebServer('localhost', 22)
        setattr(server, 'name', 'website')  #设置实例,该实例就有了name属性
        setattr(server, "run", test_run)    #将类外面的函数与类实例绑定在一起
        if hasattr(server, sys.argv[1]):   #检测类里是否有这个方法,sys.argv[1]是指第一个参数就是命令后面跟的类似service start的start
            fun = getattr(server, sys.argv[1])   #获取实例方法的内存地址,即server.start
            fun()      #执行方法
        #server1.run('web1')   #test_run与实例server绑定在一起,server1中是没有的,这里会报错
    
        #删除start方法
        delattr(WebServer, 'start')   #注意这里删除的是类的方法,如果删除某实例中的方法,则其它实例中还可以执行
        #server1.start()     #start方法已经被删除,这里会报错
        server.start()  #删除之后所有的实例都不能执行start方法了

    ===========以下内容为转载=====================

    #文/大明白(简书作者)
    #原文链接:http://www.jianshu.com/p/b937f346dd4a
    #著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    #Python中有一个有趣的语法,只要定义类型的时候,实现call函数,
    #这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用,
    #相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用

    #Python中有一个有趣的语法,只要定义类型的时候,实现call函数,
    #这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用,
    #相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用
    class storage(dict):
    #通过使用__setattr__, __getattr__, __delattr__
    #可以重写dict,使之通过“.”调用
        def __setattr__(self, key, value):
            self[key] = value
        def __getattr__(self, key):
            try:
                return self[key]
            except KeyError as k:
                return None
        def __delattr__(self, key):
            try:
                del self[key]
            except KeyError as k:
                return None
    
        # __call__方法用于实例自身的调用
        #达到()调用的效果
        def __call__(self, key):
            try:
                return self[key]
            except KeyError as k:
                return None
    
    s = storage()
    s.name = "hello" #这是__setattr__起的作用
    print(s("name")) #这是__call__起的作用
    print(s["name"])  #dict默认行为
    print(s.name) #这是__getattr__起的作用
    del s.name #这是__delattr__起的作用
    #print(s("name"))
    #print(s["name"])
    #print(s.name)
    
    #可以定义任意的key
    s.job = 'IT'
    s.age = 123
    print(s.job, s.age)

  • 相关阅读:
    Mac小知识点
    UIScrollView直接在StoryBoard中拖控件
    iOS小工具
    iOS设备信息
    Android Studio stuck on “Gradle: resolve dependancies '_debugCompile'” or 'detachedConfiguration1'
    iOS开发插件集
    Include guards
    oc单例
    Java反射中与自动装箱有关的坑及其解决方案
    ByxAOP——简易AOP框架
  • 原文地址:https://www.cnblogs.com/huangxm/p/5354524.html
Copyright © 2011-2022 走看看