Python 反射

Python反射

  - 通过字符串映射或修改程序运行时的状态、属性、方法。

  - 通常用于框架或库的开发。

 

反射的4个方法

  hasattr (常用)    判断对象(属性或方法)是否存,返回布尔值

  getattr (常用)    获取对象(属性或方法),返回对象方法的内存地址

  setattr          设置对象(属性或方法)

  delattr          删除对象(属性或方法)

 

# hasattr(object, name)

  判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s is eating..." % self.name)

obj = Dog("alex")
print(hasattr(obj, "name"))
print(hasattr(obj, "eat"))


>>> True True

 

# getattr(object, name[,default])
  获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
  需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s is eating..." % self.name)

obj = Dog("alex")
print(getattr(obj, "name"))
print(getattr(obj, "age", 38)) #若属性不存在,则返回一个默认值
getattr(obj, "eat")()
>>>
alex
38
alex
is eating...

 

# setarrt(obj, y, v)

  将函数装配到obj类中成为类方法。

def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.
    
    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass

--------------------------------------------------------

class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s is eating..." % self.name)

obj = Dog("alex")
getattr(obj, "age", setattr(obj, "age", 38))  # 若getarrt无法获取“age”, 就使用setattr创建"age"
print(obj.age)

>>>
38

 

结论:反射是通过字符串的形式操作对象相关的成员。一切事物都是对象!!!  

posted @ 2016-11-19 13:52  Vincen_shen  阅读(208)  评论(0编辑  收藏  举报