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
  • 相关阅读:
    重新想象 Windows 8 Store Apps (46)
    重新想象 Windows 8 Store Apps (45)
    重新想象 Windows 8 Store Apps (44)
    重新想象 Windows 8 Store Apps (43)
    重新想象 Windows 8 Store Apps (42)
    重新想象 Windows 8 Store Apps (41)
    重新想象 Windows 8 Store Apps (40)
    重新想象 Windows 8 Store Apps (39)
    重新想象 Windows 8 Store Apps (38)
    重新想象 Windows 8 Store Apps (37)
  • 原文地址:https://www.cnblogs.com/Vera-y/p/9857659.html
Copyright © 2011-2022 走看看