Python27 反射

发布时间:2019-09-16 07:34:33编辑:auto阅读(1698)

    反射:通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

    1.getattr:
    2.hasattr:判断一个对象里是否有对应(相同名称)字符串的方法
    3.setattr
    4.delattr
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print ('%s is eating...'% self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()   #让用户输入项调用Dog类中的功能(方法)
    
    d.choice()

    image_1c17eg6q8fcj1td2bnq1jo01vnb9.png-13.4kB
    图中输入choice的内容是一个字符串,正常调用d.eat()这可不是一个字符串。
    报错提示Dog中不存在attribute choice(字符串)

    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print ('%s is eating...'% self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()   
    
    print (hasattr(d,choice))   #判断对象d里是否有对应eat字符串的方法    #hasattr的全称就是hasattribute(有没有属性....)
    
    执行结果:
    >>:eat
    True    #通过这种方式就可以确认在class Dog中是否存在eat功能了
    
    执行结果:
    >>:talk
    False
    
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print ('%s is eating...' % self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):   #如果d中存在eat
        getattr(d,choice)()  #就用getattr调用d.eat,后面不加括号的话就是打印内存信息了
    #根据字符串去获取d对象里的方法的内存地址
    执行结果:
    >>:eat
    XiaoBai is eating...
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food): #设置food参数
            print ('%s is eating...' % self.name,food)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
        func = getattr(d,choice) #当前func==d.eat
        func('Bone')    #将Bone传给food参数
    
    setattr()
    我们通过ctrl点进去setattr中

    image_1c17gckbcjhda4k1v8p1q2km16m.png-16.9kB
    x表示对象
    y被引号引着表示y是字符串
    x.y=v v相当于值

    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
        func = getattr(d,choice)
        func('Bone')
    else:
        setattr(d,choice,bulk)  #将bulk赋值给choice(这里choice=talk,也就相当于赋值给talk)
        d.talk(d)
        #这里choice=talk,这里d.talk=bulk,bulk本身是一个函数内存地址,将这个内存地址赋值给了talk,当前talk相当于bulk这个函数了,所以调用d.talk就相当于调用bulk这个函数,而d.bulk则是不存在的.
    
    执行结果:
    >>:talk
    XiaoBai is yelling.....
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
        func = getattr(d,choice)
        func('Bone')
    else:
        # setattr(d,choice,bulk)
        # d.talk(d)
        setattr(d,choice,22)    #建立一个新的、不存在的静态属性,赋予值22
        print (getattr(d,choice))
    
    执行结果:
    >>:age  #建立的静态属性名称为age,然后得到赋值22
    22
    
    执行结果:
    >>:name     #这里输入已存在的变量名
    Traceback (most recent call last):
      File "E:/Python/练习代码/A1.py", line 20, in <module>
        func('Bone')
    TypeError: 'str' object is not callable
    #因为name的值已经通过func = getattr(d,choice)获取了,不能通过func('Bone')这样调用
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
    
        setattr(d,choice,'LeLe')    #设置已有属性的值(相当于更改了)
    
    else:
        # setattr(d,choice,bulk)
        # d.talk(d)
        setattr(d,choice,22)
        print (getattr(d,choice))
    
    print (d.name)
    
    执行结果:
    >>:name
    LeLe    #可以看到已经不是XiaoBai了,是改过的LeLe
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
    
        delattr(d,choice)   #删除属性
    
    else:
        # setattr(d,choice,bulk)
        # d.talk(d)
        setattr(d,choice,22)
        print (getattr(d,choice))
    
    print (d.name)
    
    执行结果:
    >>:name     #指定删除name这个属性
    Traceback (most recent call last):
      File "E:/Python/练习代码/A1.py", line 28, in <module>
        print (d.name)
    AttributeError: 'Dog' object has no attribute 'name'
    #可以看到name属性已不存在
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
    
        getattr(d,choice)
    
    else:
        setattr(d,choice,None)
        print (d.choice)    #这里是不能这么打印的,这里的choice只是单纯的一个叫choice的字符串,而不是choice = input输入的值。
        AA = d.choice
    
    print (d.name)
    
    执行结果:
    >>:age
    Traceback (most recent call last):
      File "E:/Python/练习代码/A2.py", line 25, in <module>
        print (d.choice)
    AttributeError: 'Dog' object has no attribute 'choice'
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
    
        getattr(d,choice)
    
    else:
        setattr(d,choice,None)
        AA = getattr(d,choice)      #需要先通过getattr获取这个choice的值
        print (AA)
    
    执行结果:
    >>:age
    None
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print ('%s is eating...' % self.name,food)
    
    def bulk(self):
        print ('%s is yelling.....' %self.name)
    
    d = Dog('XiaoBai')
    choice = input('>>:').strip()
    
    if hasattr(d,choice):
    
        getattr(d,choice)
    
    else:
        setattr(d,choice,None)
        print (d.age)   #这个age就是choice=input输入的值,因为age存在所以可以直接打印
        AA = getattr(d,choice)      #需要先通过getattr获取这个choice的值
        print (AA)
    
    执行结果:
    >>:age
    None    #print (d.age)
    None    #print (AA)
    

关键字