python3之反射

本章节介绍反射,分享给刚学python的小伙伴,一起学习,共同进步

  1. 内置函数的作用及用法

    python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,该四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

    hasattr(obj,name_str):判断一个对象obj里是否有name_str字符串对应的的方法或者属性
    getattr(obj,name_str):相当于obj.name_str,根据字符串去获取obj对象里对应的方法的内存地址或对应属性的值
    setattr(x, ‘y’, v) :相当于x.y = v'',即通过字符串设置新的属性或方法 delattr(x, 'y'):相当于del x.y’’,删除对象obj里y字符串对应的属性

  2. 案例详解

	ef bulk(self): #外部方法
    print("%s is yelling..." % self.name)
 
class Dog(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
 
    def eat(self):
        print("%s is eating..." %self.name)
 
d = Dog("小黄",1)
choice  = input("请输入属性或方法>>:").strip()
 
if choice == "name":
    # 判断对象中是否有字符串对应的属性
    print(hasattr(d,choice)) # true
 
    # 根据字符串去对象中获取对应属性的值
    attr = getattr(d,choice)
    print(attr) # 小黄
 
    # 修改对象中字符串对应属性的值
    setattr(d,choice,"小白")
    print(d.name) # 小白
 
    # 删除对象中字符串对应的属性
    delattr(d,choice)
    print(d.name) # 报错:AttributeError: 'Dog' object has no attribute 'name'
 
elif choice == "eat":
    # 判断对象中是否有字符串对应的方法
    print(hasattr(d, choice))  # true
 
    # 据字符串去获取obj对象里对应的方法的内存地址,然后调用这个方法
    func = getattr(d,choice)
    func() # 小黄 is eating...
 
    # 方法不能删除?还是我的用法有错?
    # delattr(d, choice) # 报错:AttributeError: eat
 
elif choice == "talk":
    # 通过字符串设置新的方法,可动态地将一个外部的方法装配到类里
    # bulk现在相当于一个变量名,你现在用talk来代替了
    # 1.方法写死
    # setattr(d,choice,bulk)
    # d.talk(d) # 小黄 is yelling...
    # 2.方法不写死
    setattr(d,choice,bulk)
    func = getattr(d,choice)
    func(d) # 小黄 is yelling...
 
else:# choice输入money
    # 通过字符串设置新的属性
    setattr(d, choice, 22)
    print(getattr(d,choice)) # 22
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值