zoukankan      html  css  js  c++  java
  • Python_反射

    反射:根据字符串来获取相应的内存对象(相应对象的内存地址)

    关于反射的几个函数:hasattr(),  getattr(),  setattr(),  delattr()

    1. hasattr(object,name)                                                      

    判断一个对象里是否有name属性或者方法,如果有返回Ture,否则返回False

    2.getattr(object,name[,default])                                       

    获取对象object的属性或方法,若存在则打印出来,若不存在打印默认值

    (注:若返回对象是方法,则返回的是方法的内存地址)

    import sys
    class Animal(object):
        def __init__(self,name):
            self.name = name
    
        def Dog(self):
            print('%s 吃粑粑。。' % self.name)
    
        def Cat(self):
            print('%s 喵喵叫。。' % self.name)
    
        def Print_A(self):
            self.Dog()
            self.Cat()
    
    if __name__=='__main__':
        D = Animal('狗类')
        C = Animal('猫类')
    #    D.Dog()
    #    C.Cat()
        if hasattr(D, sys.argv[1]):       # 判断D实例中,是否有Dog属性
            func = getattr(D, sys.argv[1])         # 获取D.Dog方法的内存地址
            func()
        else:
            print('Animal中没有这个类。。')
    示例代码
    D:1.pycharm>dir
     驱动器 D 中的卷是 软件
     卷的序列号是 0002-A33B
    
     D:1.pycharm 的目录
    
    2018/10/26  15:13    <DIR>          .
    2018/10/26  15:13    <DIR>          ..
    2018/10/26  16:19    <DIR>          .idea
    2018/09/07  08:18    <DIR>          day 2018_09_06
    2018/08/13  16:37    <DIR>          day1
    2018/09/09  18:35    <DIR>          day2
    2018/09/05  10:05    <DIR>          day2018_09_04
    2018/09/07  19:40    <DIR>          day2018_09_07
    2018/09/09  09:47    <DIR>          day2018_09_08
    2018/09/18  21:01    <DIR>          day2018_09_10
    2018/09/13  10:27    <DIR>          day2018_09_12
    2018/09/13  10:55    <DIR>          day2018_09_13
    2018/09/14  18:18    <DIR>          day2018_09_14
    2018/09/17  17:56    <DIR>          day2018_09_16
    2018/09/18  16:56    <DIR>          day2018_09_17
    2018/09/18  21:20    <DIR>          day2018_09_18
    2018/09/21  17:41    <DIR>          day2018_09_19
    2018/09/22  15:10    <DIR>          day2018_09_21
    2018/09/24  21:16    <DIR>          day2018_09_22
    2018/09/27  18:16    <DIR>          day2018_09_25
    2018/10/13  17:41    <DIR>          day2018_09_26
    2018/10/19  18:13    <DIR>          day2018_10_14
    2018/10/25  16:57    <DIR>          day2018_10_18
    2018/10/25  21:00    <DIR>          day2018_10_25
    2018/10/26  16:18    <DIR>          day2018_10_26
    2018/09/07  16:44    <DIR>          day2018_9_5
    2018/08/16  16:59    <DIR>          day3
    2018/09/03  20:48    <DIR>          day4
    2018/09/03  20:53    <DIR>          test
                   0 个文件              0 字节
                  29 个目录 67,621,523,456 可用字节
    
    D:1.pycharm>cd day2018_10_26
    
    D:1.pycharmday2018_10_26>dir
     驱动器 D 中的卷是 软件
     卷的序列号是 0002-A33B
    
     D:1.pycharmday2018_10_26 的目录
    
    2018/10/26  16:18    <DIR>          .
    2018/10/26  16:18    <DIR>          ..
    2018/10/26  15:13                 0 __init__.py
    2018/10/26  16:18               773 反射.py
                   2 个文件            773 字节
                   2 个目录 67,621,457,920 可用字节
    
    D:1.pycharmday2018_10_26>python 反射.py habit
    Animal中没有这个类。。
    
    D:1.pycharmday2018_10_26>python 反射.py Dog
    狗类 吃粑粑。。
    Terminal操作

    注:

    • sys.argv[1]:表示传入的系统命令参数
      • 如D:1.pycharmday2018_10_26>python 反射.py Dog
    • sys.argv[0]:表示获取脚本本身的名称

    3.setattr(object,name,values)                                              

    给对象的属性赋值,若属性不存在,先创建再赋值

    (注:可用于给实例绑定方法)

    import sys
    class Animal(object):
        Rabbit='兔子吃草。。略略略'
        def __init__(self,name):
            self.name = name
    
        def Dog(self):
            print('%s 吃粑粑。。' % self.name)
    
        def Cat(self):
            print('%s 喵喵叫。。' % self.name)
    
        def Print_A(self):
            self.Dog()
            self.Cat()
    
    def Tortoise(name):
        print('%s 吃肉肉。。' % name)
    
    def Tortoise1(self,name):       # 这样就可以调用Animal里的属性或者方法了
        print('%s 吃肉肉。。' % name,self.Rabbit)
    
    
    if __name__=='__main__':
        D = Animal('狗类')
        C = Animal('猫类')
    #    D.Dog()
    #    C.Cat()
        
    setattr(D, 'T', Tortoise)   # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名
        D.T('龟龟类')   # 把方法绑定在实例上的
       # C.T('龟龟类')   这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上
    
        setattr(C, 'T1', Tortoise1)
        C.T1(C,'龟龟类')     # 这里需要把如果Tortoise1里想要调用Animal里的东西需要把Animal或实例化了的C或D任意一个传进去
    setattr
    龟龟类 吃肉肉。。
    龟龟类 吃肉肉。。 兔子吃草。。略略略
    result

    4.delattr(object,'name')                                                        

    删除object对象的方法或属性

    import sys
    class Animal(object):
        Rabbit='兔子吃草。。略略略'
        def __init__(self,name):
            self.name = name
    
        def Dog(self):
            print('%s 吃粑粑。。' % self.name)
    
        def Cat(self):
            print('%s 喵喵叫。。' % self.name)
    
        def Print_A(self):
            self.Dog()
            self.Cat()
    
    def Tortoise(name):
        print('%s 吃肉肉。。' % name)
    
    
    if __name__=='__main__':
        D = Animal('狗类')
        C = Animal('猫类')
    #    D.Dog()
    #    C.Cat()
    
        setattr(D, 'T', Tortoise)   # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名
        D.T('龟龟类')   # 把方法绑定在实例上的
       # C.T('龟龟类')   这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上
    
    
        # delattr(D,'Dog')       # D 是实例,无法删除Animal类里的方法
       # delattr(Animal,'Dog')       # 但是可以类删除里面的方法
       # D.Dog()           #   AttributeError: 'Animal' object has no attribute 'Dog'
        delattr(D, 'T')      # 可以删除实例绑定的方法'T'
        D.T('龟龟类')
    delattr
  • 相关阅读:
    共享纸巾更换主板代码分析 共享纸巾主板更换后的对接代码
    Python Django Ajax 传递列表数据
    Python Django migrate 报错解决办法
    Python 创建字典的多种方式
    Python 两个list合并成一个字典
    Python 正则 re.sub替换
    python Django Ajax基础
    Python Django 获取表单数据的三种方式
    python Django html 模板循环条件
    Python Django ORM 字段类型、参数、外键操作
  • 原文地址:https://www.cnblogs.com/Vera-y/p/9857659.html
Copyright © 2011-2022 走看看