• 2019年8月9日 反射/自省


    反射/自省:程序可以访问,检测和修改本身状态或行为的一种能力。

    python中提供四种函数:

    hasattr(obj,name) 判断obj中有没有一个name字符串对应的方法或者属性

    getattr(obj,name(,default))等到obj中name的值

    setattr(obj,name,value)设置obj中name的值时value

    delattr(obj,name) 删除obj中的name值

    class BlackMedium:
        feture='ugly'
        def __init__(self,name1,addr):
            self.name=name1
            self.addr=addr
    
        def sell_hourse(self):
            print('%s正在卖房'%self.name)
    
        def rent_hourse(self):
            print('%s租房子'%self.name)
    
    
    b1=BlackMedium('zyk','sh')
    r=hasattr(b1,'name')
    print(r)
    s=hasattr(b1,'sell_hourse') #在查询b1能不能调用class BlackMedium中的属性
    print(s)
    w1=getattr(b1,'name') #同b1.name
    w2=getattr(b1,'rent_hourse')#没有默认参数,如果没有就会报错
    w3=getattr(b1,'abc','没有这个属性')#如果没有,就反馈默认参数
    print(w1,w2,w3)#w2是函数地址
    w2()
    
    b1.sb=True#上下两个方法都能用,设置与修改的功能
    setattr(b1,'sb2',False)
    print(b1.__dict__)
    del b1.sb
    delattr(b1,'sb2')#删除
    print(b1.__dict__)

    》》》

    True
    True
    zyk <bound method BlackMedium.rent_hourse of <__main__.BlackMedium object at 0x102097dd8>> 没有这个属性
    zyk租房子
    {'name': 'zyk', 'addr': 'sh', 'sb': True, 'sb2': False}
    {'name': 'zyk', 'addr': 'sh'}

    class BlackMedium:
        feture='ugly'
        def __init__(self,name1,addr):
            self.name=name1
            self.addr=addr
    
        def sell_hourse(self):
            print('%s正在卖房'%self.name)
    
        def rent_hourse(self):
            print('%s租房子'%self.name)
    
    
    b1=BlackMedium('zyk','sh')
    setattr(b1,'func',lambda x:x+1)#定义类func函数,x做参数,返回x+1
    print(b1.__dict__)
    print(b1.func(3))
    setattr(b1,'func2',lambda self:self.name+'sb')#注意调用的是自己
    print(b1.func2(b1))

    》》》

    {'name': 'zyk', 'addr': 'sh', 'func': <function <lambda> at 0x102188f28>}
    4
    zyksb

    hello文件中
    class Ftb:
        def __init__(self,addr):
            self.addr=addr
            print('正在上传%s'%addr)
    
    test文件中
    from hello import Ftb
    #从hello中倒入 Ftb 类
    f1=Ftb('12,12,12')
    if hasattr(f1,'get'):
        func_get=getattr(f1,'get')
        func_get()
        #f1.get()
    else:
        print('不存在get该方法')
        print('处理其他的逻辑')
        # 好处就是不必纠结get方法怎么实现的,以后有get方法了会实施
    
    hello 文件中
    #补上get函数
        def get(self):
            print('正在上传文件') 
    #反射的应用场景,可插拔设计。

    》》》

    正在上传12,12,12
    正在上传文件

  • 相关阅读:
    使用原始XML资源——使用原始XML文件
    使用原始XML资源——定义原始XML资源
    属性动画(Property Animation)资源
    使用(Drawable)资源———AnimationDrawable资源
    使用(Drawable)资源———ClipDrawable资源
    RabbitMQ基本理论
    Celery分布式任务队列快速入门
    python多版本管理包pyenv
    CentOS6最佳实践
    BASH 基本语法
  • 原文地址:https://www.cnblogs.com/python1988/p/11329326.html
Copyright © 2020-2023  润新知