• 反射


    # 反射主要是程序可以访问,监测和修改它本身状态或行为的一种能力(自省)。
    # 四个可以实现自省的函数
    # hasattr(object,name) 判断object中有没有一个name字符串对应的方法或者属性
    #getattr(obj, attr,default = None):
    # 调用这个方法将返回obj中名为attr值的属性的值,例如如果attr为'bar',则返回obj.bar。
    # 没有的话就返回默认值
    # setattr(obj, attr, val):
    # 调用这个方法将给obj的名为attr的值的属性赋值为val。例如如果attr为'bar',
    # 则相当于obj.bar = val。
    # delattr(obj,attr) #del obj.attr
    # 四个方法的演示
    class BlackMedium:
        feature = "Ugly"
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
        def sell_house(self):
            print("%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不是傻逼" % self.name)
        def rent_house(self):
            print("%s 黑中介租房子啦,傻逼才租呢" %self.name)
    
    b1 = BlackMedium("中介","房子")
    
    # 监测是否含有某属性
    # 可以是数据属性,也可以是函数属性
    print(hasattr(b1,'name'))
    print(hasattr(b1,'sell_house'))
    
    # 获取属性
    n = getattr(b1,'name')
    func = getattr(b1,'rent_house')
    print(n)
    func()
    # getattr(b1,'age') # 出错
    # 要设置默认属性,这样没有的时候才不会报错
    print(getattr(b1,'age','没有这个属性'))
    
    # 设置属性
    setattr(b1,'gender','male')
    print(b1.gender)
    setattr(b1,'show_name',lambda self:self.name + 'sb')
    print(b1.__dict__)
    print(BlackMedium.__dict__)
    print(b1.show_name(b1)) # 不会自动传入参数,需手动
    
    # 删除属性
    delattr(b1,'addr')
    delattr(b1,'show_name')
    # 此时已经没有了show_name属性,所以会报错
    # delattr(b1,'show_name')
    print(b1.__dict__)
    
    # 类也是对象
    class Foo(object):
        staticField = 'old boy'
        def __init__(self):
            self.name = 'wang'
        def func(self):
            return 'func'
        @staticmethod
        def bar():
            return 'bar'
    print(getattr(Foo,'staticField'))
    print(getattr(Foo,'func'))
    print(getattr(Foo,'bar'))
    
    import sys
    def s1():
        print('s1')
    def s2():
        print('s2')
    this_module = sys.modules[__name__]
    print(hasattr(this_module,'s1'))
    print(getattr(this_module,'s2'))
    print(this_module)
    # 也可以用反射来查找某个模块是否存在某个方法
  • 相关阅读:
    17.10.30
    17.10.28&29
    PDO和Mysqli的区别
    ajax--->请求异常 jQuery提示parsererror错误解决办法
    ajax--->http头信息的content-type是application/x-www-form-urlencoded或application/json区别
    php--->把json传来的stdClass Object类型转array
    mysql--->mysql查看数据库操作记录
    js解析json时报:Unexpected token s in JSON at position 0
    code review工具之codebrag安装使用
    linux-->yii2报yiidbException错
  • 原文地址:https://www.cnblogs.com/cong12586/p/11371694.html
Copyright © 2020-2023  润新知