面向对象编程之反射

反射

定义:通过字符串对对象的属性和方法进行操作。

反射有4个方法,都是python内置的,分别是:

hasattr(obj,name:str)

通过“字符串”判断对象的属性或方法是否存在返回bool值,True表示有,False表示没有。

注意:查询方法时,只需写方法名,不要加小括号!!!

class User:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender def show_userinfo(self):
print(f"姓名:{self.name},年龄:{self.age},性别:{self.gender}") # 创建user对象
user = User("haha", 37, "男")
# 查询属性name 是否存在
res = hasattr(user, "name")
print(res) # 输出结果:True
# 查询方法show_userinfo 是否存在。注意:不要加括号!!
res_func = hasattr(user, "show_userinfo")
print(res_func) # 输出结果:True
res_func = hasattr(user, "show_userinfo()")
print(res_func) # 输出结果:False

getattr(obj,name:str,[default])

通过“字符串”获取对象的属性或方法

注意

1.如果只传入前两个参数,当属性或方法不存在,会报错

2.为了防止当属性或方法不存在,该方法报错,设置第三个参数为找不到时的默认值

3.获取方法时,不要带小括号!!!

# 创建user对象
user = User("haha", 37, "男")
# 获取属性值
res = getattr(user, "name")
print(res) # 输出结果:haha
# 获取不存在的属性
res_false = getattr(user, "uid")
print(res_false) # 报错
# 设置默认值
res_true = getattr(user, "uid", "不存在")
print(res_true) # 不报错,输出结果:不存在 # 获取方法
res_func = getattr(user, "show_userinfo")
print(res_func) # 输出结果:方法内存地址
# 获取带括号的方法
func_false = getattr(user, "show_userinfo()")
print(func_false) # 报错
# 设置默认值
func_true = getattr(user, "show_userinfo()", "不存在")
print(func_true) # 不报错,输出结果:不存在

setattr(obj,name:str,value)

通过“字符串”设置对象的属性或方法

# 创建user对象
user = User("haha", 37, "男")
# 新增一个属性hobby,属性值是read
setattr(user, "hobby", "read")
print(user.hobby) # 输出:read
# 修改属性age的值
setattr(user, "age", 27)
print(user.age) # 输出:27

delattr(obj,name:str)

通过“字符串”删除对象的属性或方法

注意:

删除不存在的属性或方法,会报错

删除方法时,不要带小括号!!

# 创建user对象
user = User("haha", 37, "男")
# 删除属性gender
delattr(user, "gender")
print(user.gender) # 删除后,输出结果:报错'User' object has no attribute 'gender'
# 删除一个对象没有的属性
delattr(user, "hobby") # 不存在的属性,删除会报错

最新文章

  1. 扩大ubuntu虚拟机硬盘空间
  2. node.js笔记
  3. servletconfig和servletContext的区别
  4. ubuntu 添加启动器
  5. 繁华模拟赛 Evensgn的债务
  6. JS-商品图片点击轮换
  7. linux局域网不能相互访问
  8. C程序设计语言练习题1-2
  9. 弹出输入内容prompt
  10. 通过XDocument方式把List写入Xml文件
  11. 基于Servlet+jsp的web计算器
  12. C#中访问私有成员技巧
  13. textspan 转连接
  14. MSSQL 调用C#程序集 实现C#字符串到字符的转化
  15. springboot+mybaties
  16. js,javascript,获取地址栏参数
  17. SVG生成字体图标详解
  18. CentOS命令行界面与图形界面切换(图文详解)
  19. Request爬取网站(seo.chinaz.com)百度权重的查询结果
  20. SQL2005 全文检索超时的解决方案

热门文章

  1. [PHP] 存储改造中的逻辑和清理遗留的问题
  2. JavaScript显式类型转换与隐式类型转换
  3. 高频Python面试题分享
  4. [C8] 聚类(Clustering)
  5. 《Dapper》
  6. docker 创建mysql容器并且绑定到本地navicat
  7. python实现异步调用函数执行
  8. select使用css居右对齐
  9. k8s 二进制部署详解
  10. [线段树]Luogu P3372 线段树 1【模板】