Python中对于反射的理解

反射简单的理解:就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)(最简单理解就是通过字符串操作属性)接下来让我们记录下反射的几个方法:

hasattr
  • 判断对象中是否有这个方法或变量
class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s正在吃便便" % self.name)

dog = Dog('铁牛')
print hasattr(dog, 'name')  # True 因为存在name这个变量
print hasattr(dog, 'eat')   # True  因为存在eat这个方法
print hasattr(dog , 'play')  # False  因为不存在play这个方法或者变量
getattr
  • 获取对象中的方法或变量的内存地址
class Dog(object):

    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s 正在吃便便" % self.name)

dog = Dog('铁牛')

get_dog = getattr(dog, 'name')  # 获取name变量内存地址
print get_dog                   # 此时打印的是铁牛
eat_dog = getattr(dog, 'eat')   # 获取eat方法的内存地址
eat_dog()                       # 此时打印的是  "铁牛正在吃便便"
print eat_dog                   # 此时打印的是 <bound method Dog.eat of <__main__.Dog object at 0x00000000037EE6A0>>

# 接下来我们看getattr有三个参数,那么第三个参数是什么呢 ?我们验证一下:
# getattr(o, name, default)
print getattr(dog, 'play', 'Not find')  # 此时打印的是Not find 因为 dog对象中没有play这个的变量或者方法
setattr
  • 给对象添加变量或方法
def drink(self):
    print("%s 正在喝beer" % self.name)


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


dog = Dog('铁牛')
setattr(dog, 'eat', drink)  # 将drink函数添加到对象dog中, 并且命名为eat
dog.eat(dog)                # 调用eat方法, 因为这是额外添加的方法, 需手动传入对象

setattr(dog, 'age', 18)    # 添加一个变量, 复制为18
print dog.age              # 打印结果为:18
delattr
  • 删除 对象中的变量。注意:不能用于删除方法
class Dog(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s 正在吃便便" % self.name)


dog = Dog('铁牛')
delattr(dog, 'name')  # 此时删除name属性
print dog.name        # 此时会报错:AttributeError: 'Dog' object has no attribute 'name'  因为delattr:将上面的"name"属性删除了
delattr(dog, 'eat')     # AttributeError: eat  报错!!!  因为delattr 不能用于删除方法,只能删除属性
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值