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.pycharm\day2018_10_26>dir
 驱动器 D 中的卷是 软件
 卷的序列号是 0002-A33B

 D:\1.pycharm\day2018_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.pycharm\day2018_10_26>python 反射.py habit
Animal中没有这个类。。

D:\1.pycharm\day2018_10_26>python 反射.py Dog
狗类 吃粑粑。。
Terminal操作

注:

  • sys.argv[1]:表示传入的系统命令参数
    • 如D:\1.pycharm\day2018_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

 

posted @ 2018-10-26 17:27  yin_zhaozhao  阅读(152)  评论(0编辑  收藏  举报