反射

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'

 

posted on 2017-08-01 10:07  momo8238  阅读(135)  评论(0编辑  收藏  举报