面向对象编程之反射

反射

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

反射有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") # 不存在的属性,删除会报错

python基础-面向对象编程之反射的更多相关文章

  1. python基础-面向对象编程之继承

    面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...

  2. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  3. python基础-面向对象编程之多态

    面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...

  4. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  5. Python基础教程之List对象 转

    Python基础教程之List对象 时间:2014-01-19    来源:服务器之家    投稿:root   1.PyListObject对象typedef struct {    PyObjec ...

  6. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  7. Python基础2:反射、装饰器、JSON,接口

    一.反射 最近接触到python的反射机制,遂记录下来已巩固.但是,笔者也是粗略的使用了__import__, getattr()函数而已.目前,笔者的理解是,反射可以使用户通过自定义输入来导入响应的 ...

  8. python基础-类的反射

    1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...

  9. python基础学习笔记——反射

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

随机推荐

  1. Django框架(二十二)-- Django rest_framework-解析器

    一.解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理,将传过来的数据解析成字典 二.使用解析器 1.局部使用 在视图类中重定义parser_classes即可, ...

  2. [MySQL] 解决Error 1698: Access denied for user 'root'@'localhost'

    当程序中使用root账号连接mysql时报以下错误,但是使用命令行是可以正常连接的,那么就查询下mysql数据库的user表,查看下当前用户的密码加密方式,看看是不是unix_socketMariaD ...

  3. Eclipse修改JSP文件的默认编码

    Eclipse新建JSP文件,可以看到默认使用的是ISO-8859-1编码,如下图,而这种编码是无法保存中文的,不符合我们的需求 那么应该怎样修改呢?找到菜单Window-Preferences,找到 ...

  4. 29.Java基础_接口

    接口的成员特点

  5. day55_9_19模型层的操作

    一.配置settings. 如果是queryset对象 那么可以点query直接查看该queryset的内部sql语句 将以下代码放入settings中.就可以实现当使用orm时查看sql语句: LO ...

  6. 浅谈C++ STL vector 容器

    浅谈C++ STL vector 容器 本篇随笔简单介绍一下\(C++STL\)中\(vector\)容器的使用方法和常见的使用技巧.\(vector\)容器是\(C++STL\)的一种比较基本的容器 ...

  7. 洛谷 P4710 「物理」平抛运动

    洛谷 P4710 「物理」平抛运动 洛谷传送门 题目描述 小 F 回到班上,面对自己 28 / 110 的物理,感觉非常凉凉.他准备从最基础的力学学起. 如图,一个可以视为质点的小球在点 A(x_0, ...

  8. 洛谷P3157 [CQOI2011]动态逆序对

    题目大意: 给定\(1\)到\(n\)的一个排列,按照给定顺序依次删除\(m\)个元素,计算每个元素删除之前整个序列的逆序对数量 基本套路:删边变加边 那么我们不就是求满足\(pos_i<pos ...

  9. vue使用技巧

    引入外部js文件 1.在根目录创建文件夹,例如‘libs’,将js文件拷贝至libs目录下 2.修改webpack.dev.conf.js和webpack.prod.conf.js,在CopyWebp ...

  10. Python之Flask框架项目Demo入门

    Python+Flask框架项目Demo入门 本例子用到了 Flask+蓝图+Flask-Login+SQLAlchemy+WTForms+PyMySQL相关架构 Flask Web框架介绍 Flas ...