zoukankan      html  css  js  c++  java
  • python类的反射

    反射

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

    小例子--根据用户输入调用方法:

    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print("%s is eating..",self.name)
    
    d= Dog('二哈')
    choice = input(">>:").strip()
    d.choice()
    =========执行结果===========
    >>:eat
    Traceback (most recent call last):
      File "E:/pywww/day06/11.py", line 13, in <module>
        d.choice
    AttributeError: 'Dog' object has no attribute 'choice'
    

     这里用户输入的只是一个字符串,所以不会把输入的内容当作类的方法执行。

    最原始的办法就是加个判断,然后判断输入的字符串是不是在这个类里有这个方法,但是这种灵活度不好。所以可以用到下面这种方法。

     hasattr(obj,name_str)

    输入一个字符串,判断对象有没有这个方法。

    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print("%s is eating.."% self.name)
    
    d= Dog('二哈')
    choice = input(">>:").strip()  #eat
    print(hasattr(d,choice))         #True         
    

    getattr(obj,name_str)

    如果是方法返回对象的内存地址,如果是属性直接返回该属性的值

    print(getattr(d,choice)) #<bound method Dog.eat of <__main__.Dog object at 0x0000000000A72358>>
    

     如果是一个不存在的方法会报错:AttributeError: 'Dog' object has no attribute 'aa'

    既然是地址就说明加上括号就可以调用了:

    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print("%s is eating.."% self.name)
    
    d= Dog('二哈')
    choice = input(">>:").strip()  #eat
    getattr(d,choice)()  #二哈 is eating..
    

     以上两个方法可以组合起来使用:

    if hasattr(d,choice):
        getattr(d,choice)() #二哈 is eating..
    

     也可以赋值给一个变量,然后传参给方法

    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print("%s is eating.."% self.name,' like ',food)
    
    d= Dog('二哈')
    choice = input(">>:").strip() #eat
    if hasattr(d,choice):
        func = getattr(d,choice)
        func('包子')         #二哈 is eating..  like  包子
    

    setattr(x,'y',v) x.y = v

    添加一个方法

    def bulk(self):                                                  #先定义要添加的方法
        print('%s wang wang wang' % self.name)
    
    class Dog(object):
    
        def __init__(self,name):
            self.name = name
    
        def eat(self,food):
            print("%s is eating.."% self.name,' like ',food)
    
    d= Dog('二哈')
    choice = input(">>:").strip()  #bulk
    if hasattr(d,choice):
        func = getattr(d,choice)
        func('包子')
    else:
        setattr(d,choice,bulk) 
        d.bulk(d)          #bulk 是你输入的字符串 ,这里要把d传进去,不然提示你少传一个参数进去
    

     上面是动态装载一个方法,也可以动态装载一个属性

     setattr(d,choice,22) #age
        print(getattr(d,choice))  #22
    

    delattr(obj,name_str)

     动态删除属性或方法

     delattr(d,choice)
    
  • 相关阅读:
    Genymotion安卓模拟器和VirtualBox虚拟机安装、配置、测试(win7_64bit)
    jQuery UI (15)图标
    CSS(01)CSS层叠样式表
    Jquery(12)Jquery Ajax跨域访问
    Jquery(13)Jquery this的指向
    Jquery(18)Jquery Cookie操作
    EntityFramework报错
    单例模式应用
    FormCollection的用法
    $.ajax、$.post[转]
  • 原文地址:https://www.cnblogs.com/qing-chen/p/7437034.html
Copyright © 2011-2022 走看看