zoukankan      html  css  js  c++  java
  • 反射

    1.反射的作用:把字符串反射成内存中的对象的地址。两句话搞定所有判断

    #格式:
    if hasattr(d,choice):
        getattr(d,choice)
    else:
        setattr(d,choice,bulk) #d.talk=bulk
        func=getattr(d,choice)
        func(d)
    

    hasattr(obj,name_str):判断一个对象obj里是否有对应的name_str字符串的方法。

       getattr(obj,name_str) : 根据字符串去获取obj对象里的对应的方法的内存地址。

       setattr(obj,'y',z), is equivalent to  x.y=z

       delattr(obj,name):  删除obj.name

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
        def eat(self):
            print("%s is eating"%self.name)
    
    d=Dog("benben")
    choice=input(">>:").strip()
    print(hasattr(d,choice))
    print(getattr(d,choice)) #找到内存地址
    getattr(d,choice)()
    

     运行结果:

    >>:eat
    True
    <bound method Dog.eat of <__main__.Dog object at 0x0000000001312BE0>>
    benben is eating
    

     2.调用方式

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
        def eat(self,food):
            print("%s is eating %s...."%(self.name,food))
    
    d=Dog("benben")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("meat")
    

     运行结果:

    >>:eat
    benben is eating meat....
    

     3.setattr 动态增加一个方法。方法需要加括号才能调用。

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
        def eat(self,food):
            print("%s is eating %s...."%(self.name,food))
    
    d=Dog("benben")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("meat")
    else:
        setattr(d,choice,bulk)  #d.choice=bulk
        d.talk(d)
    

     运行结果:

    >>:talk
    benben is yelling...
    

     4.setattr 动态增加一个属性。属性不需要加括号就可以调用了。

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
    d=Dog("benben")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        func=getattr(d,choice)
        func("meat")
    else:
        setattr(d,choice,22) #d.choice=22,choice=age
        print(getattr(d,choice))
    

     运行结果:

    >>:age
    22
    

     5.如果客户端输入的是一个已经存在的属性:

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
    d=Dog("benben")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        attr=getattr(d,choice) #attr是一个字符串,当修改字符串属性时,在此处没用
        setattr(d,choice,"Jack")
    
    else:
        setattr(d,choice,22) #d.choice=22,choice=age
        print(getattr(d,choice))
    
    print(d.name)
    

     运行结果:

    >>:name
    Jack
    

     6. delattr()

    class Dog(object):
        def __init__(self,name):
            self.name=name
    
    d=Dog("benben")
    choice=input(">>:").strip()
    if hasattr(d,choice):
        delattr(d,choice)
    else:
        setattr(d,choice,22) #d.choice=22,choice=age
        print(getattr(d,choice))
    print(d.name)
    

     运行结果:

    >>:name
    Traceback (most recent call last):
      File "<encoding error>", line 12, in <module>
    AttributeError: 'Dog' object has no attribute 'name'
    
  • 相关阅读:
    linux下gdb常用的调试命令 .
    Programming lessons I learned
    lvalue和rvalue、传值和传引用、木桶
    gnuplot的简明教程——英文版,很不错
    100 的阶乘末尾有多少个0?
    lvalue和rvalue、传值和传引用、木桶
    gnuplot的简明教程——英文版,很不错
    100 的阶乘末尾有多少个0?
    poj1728
    poj1809
  • 原文地址:https://www.cnblogs.com/momo8238/p/7266997.html
Copyright © 2011-2022 走看看