setattr()函数与getattr()函数用法

本文主要包括以下内容:

  • 一、setattr函数
    • 1. 动态创建对象属性
    • 2. 修改对象属性
    • 3. 用于动态创建类的属性
  • 二、getattr函数
    • 1. 获取对象属性的值
    • 2. 处理属性不存在的情况
    • 3. 获取模块中的函数或变量
    • 4. 获取类方法或静态方法

一、setattr函数

setattr 是 Python 内置函数之一,它用于动态设置对象的属性。其函数构成如下:

setattr(object, attribute, value)
  • object:要设置属性的对象。
  • attribute:要设置的属性的名称(字符串)。
  • value:要设置的属性的值。

setattr 的主要用途是在运行时动态地为对象添加或修改属性。它通常用于以下几种情况:

1. 动态创建对象属性

可以在运行时根据需要为对象添加新的属性。例如:

class Person:passperson = Person()
setattr(person, "name", "John")
setattr(person, "age", 30)
print(person.name)  # 输出: John
print(person.age)   # 输出: 30

2. 修改对象属性

我们可以使用 setattr 修改对象已有的属性的值。例如:

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 25)
setattr(person, "age", 30)
print(person.age)  # 输出: 30

3. 用于动态创建类的属性

除了对象,setattr 也可以用于设置类的属性。这对于动态创建类的属性非常有用。例如:

class MyClass:passsetattr(MyClass, "class_variable", 42)
print(MyClass.class_variable)  # 输出: 42

需要注意的是,虽然 setattr 具有灵活性,但滥用它可能会导致代码不易维护或理解。因此,通常建议在需要动态属性时慎重使用,以确保代码的清晰性和可维护性。

二、getattr函数

getattr 是另一个与属性相关的内置函数,它用于获取对象的属性值。其函数构成如下:

getattr(object, attribute, default)
  • object:要获取属性值的对象。
  • attribute:要获取的属性的名称(字符串)。
  • default:如果属性不存在时的默认值(可选参数)。

getattr 的主要用途是在运行时获取对象的属性值,如果属性不存在,则可以提供一个默认值。

以下是 getattr 的一些常见用法:

1. 获取对象属性的值

我们可以使用 getattr 来获取对象的属性值。如果属性存在,它将返回属性的值,否则会引发 AttributeError 异常。

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Alice", 25)
name = getattr(person, "name")
age = getattr(person, "age")
print(name)  # 输出: Alice
print(age)   # 输出: 25

2. 处理属性不存在的情况

我们可以使用 getattr 的第三个参数来指定一个默认值,以防属性不存在。如果属性不存在,将返回指定的默认值。

class Person:def __init__(self, name):self.name = nameperson = Person("Bob")
age = getattr(person, "age", 30)  # 如果属性不存在,返回默认值 30
print(age)  # 输出: 30

getattr 在需要动态获取属性值的情况下非常有用,尤其是当你不确定属性是否存在或希望提供默认值时。

除了上面提到的常见用法,getattr 还可以用于以下情况:

3. 获取模块中的函数或变量

我们可以使用 getattr 来获取模块中定义的函数或变量的引用。这在需要根据字符串的内容来动态调用模块中的函数或访问模块中的变量时非常有用。

import mathfunction_name = "sqrt"
sqrt_function = getattr(math, function_name)
result = sqrt_function(16)
print(result)  # 输出: 4.0

4. 获取类方法或静态方法

getattr 也可以用于获取类的方法,包括普通方法、类方法和静态方法。我们可以通过指定类名和方法名来获取方法的引用。

class MyClass:def instance_method(self):return "This is an instance method"@classmethoddef class_method(cls):return "This is a class method"@staticmethoddef static_method():return "This is a static method"my_instance = MyClass()
instance_method = getattr(my_instance, "instance_method")
class_method = getattr(MyClass, "class_method")
static_method = getattr(MyClass, "static_method")print(instance_method())  # 输出: This is an instance method
print(class_method())     # 输出: This is a class method
print(static_method())    # 输出: This is a static method

这些是 getattr 函数的一些常见用法,它可以在运行时根据字符串来获取对象的属性、模块中的函数或变量以及类的方法。这种动态性使得 Python 在某些情况下非常灵活和强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java上传文件到指定服务器

首先要知道服务器的用户名和密码。 注意&#xff1a;一般情况&#xff0c;如果不是强制要求&#xff0c;尽量不要将文件上传到服务器 步骤&#xff1a; 1.导入依赖 <!--图片上传到服务器需要的依赖--> <dependency> <groupId>com.jcr…

dubbo3+zookeeper/nacos+dubbo-admin

工程结构&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;1.8 springboot-parent版本&#xff1a;2.6.6springboot版本&#xff1a;2.6.6 dubbo-spring-boot-starter版本&#xff1a;3.0.7dubbo版本&#xff1a;3.0.7 dubbo-registry-zookeeper版本&#xff1a;3.0.7c…

Spring Boot的自动装配原理

Spring Boot的自动装配原理是该框架的核心特性之一&#xff0c;它通过一种智能机制来减少开发者的配置工作&#xff0c;使开发更加便捷。下面我将简要介绍Spring Boot自动装配的原理&#xff1a; 组件扫描&#xff1a;Spring Boot会自动扫描项目中的所有类&#xff0c;查找带有…

SRE实战:如何低成本推进风险治理?稳定性与架构优化的3个策略

一分钟精华速览 SRE 团队每天面临着不可控的各类风险和重复发生的琐事&#xff0c;故障时疲于奔命忙于救火。作为技术管理者&#xff0c;你一直担心这些琐事会像滚雪球一样&#xff0c;越来越多地、无止尽地消耗你的团队&#xff0c;进而思考如何系统性地枚举、掌控这些风险&a…

请求和响应的概述

请求&#xff1a;在浏览器地址栏输入地址&#xff0c;点击回车请求服务器&#xff0c;这个过程就是一个请求过程。 响应&#xff1a;服务器根据浏览器发送的请求&#xff0c;返回数据到浏览器在网页上进行显示&#xff0c;这个过程就称之为响应。 针对Servlet的每次请求&…

13、化“危机”为“契机”

10、质量审核的设立与合并 11、视频分类建议 12、建立健全人员培养培训体系 2019年底&#xff0c;内容仓的单日产量超过2.2万&#xff0c;业务部门提出了更高的产能需求&#xff0c;希望在20年达到日产近4万条的目标。为此部门根据当时的个人产能做了测算&#xff0c;提出了近…

软件测试之概念篇(需求,测试用例,BUG描述,产品的生命周期)

目录 1.什么是需求 2.什么是测试用例 3.什么是BUG 4.软件的生命周期 5.测试的生命周期 1.什么是需求 在大多数软件公司&#xff0c;一般会有两部分需求&#xff1a; 用户需求&#xff1a;可以理解为就是甲方提出需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用…

IDEA使用模板创建webapp时,web.xml文件版本过低的一种解决方法

创建完成后的web.xml 文件&#xff0c;版本太低 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Appl…

Springboot使用sqlcipher4加密sqlite数据库

在有些业务场景&#xff0c;需要使用sqlite数据库&#xff0c;但sqlite数据库生的db文件&#xff0c;是明文的&#xff0c;该文件被别人拿到&#xff0c;就可以看到里面的所有数据&#xff0c;非常不安全&#xff0c;市面上有很多对sqlite数据库文件加密的方式&#xff0c;但都…

【Overload游戏引擎分析】编辑器对象鼠标拾取原理

Overload的场景视图区有拾取鼠标功能&#xff0c;单击拾取物体后会显示在Inspector面板中。本文来分析鼠标拾取这个功能背后的原理。 一、OpenGL的FrameBuffer 实现鼠标拾取常用的方式有两种&#xff1a;渲染id到纹理、光线投射求交。Overload使用的是渲染id到纹理&#xff0c…

ESP32网络开发实例-WebSocket服务器

WebSocket服务器 文章目录 WebSocket服务器1、WebSocket介绍2、应用实例介绍3、软件准备4、硬件准备5、代码实现在本文中,将介绍如何使用 WebSocket 通信协议通过 ESP32 构建 Web 服务器。 例如,我们将向介绍如何构建网页以远程控制 ESP32 输出。 输出状态显示在网页上,并在…

在windows系统上安装pgAdmin4

pgAdmin4是全球最先进的开源数据库PostgreSQL的领先开源管理工具。它旨在满足新手和经验丰富的PostgreSQL用户的需求&#xff0c;提供了强大的图形界面&#xff0c;可简化数据库对象的创建、维护和使用。 pgAdmin4是Python开发的Web应用程序&#xff0c;既可以部署为Web模式通…

Python单例模式详解与实际应用

在软件开发中&#xff0c;单例模式被广泛应用&#xff0c;它是一种创建型设计模式。在Python中&#xff0c;通过单例模式&#xff0c;我们可以确保某个类只有一个实例&#xff0c;并且该实例可以全局访问。本文将深入探讨Python的单例模式以及其实际应用&#xff0c;包括代码示…

经典面试题第十一更---类型转换

前言&#xff1a; &#x1f921; 作者简介&#xff1a;我是Morning&#xff0c;计算机的打工人&#xff0c;想要翻身做主人 &#x1f648; &#x1f648; &#x1f648; &#x1f3e0; 个人主页&#xff1a; Morning的主页 &#x1f4d5;系列专栏&#xff1a;前端…

CSS图文悬停翻转效果完整源码附注释

实现效果截图 HTML页面源码 <!DOCTYPE html> <html><head><meta http-equiv="content-type

M4Singer Ubuntu 4060ti16G 笔记

显卡 (venv3712) (python3.7.12) yeqiangyeqiang-Default-string:~/Downloads/ai/M4Singer/code$ nvidia-smi Mon Oct 9 12:09:50 2023 --------------------------------------------------------------------------------------- | NVIDIA-SMI 535.113.01 …

一站式数据可视化与分析平台JVS智能BI强大的数据节点功能

在商业智能&#xff08;BI&#xff09;中&#xff0c;数据集是数据的集合&#xff0c;用于分析和报告。数据节点是数据集中的一个重要组成部分&#xff0c;它代表数据集中的一个特定数据点或数据元素。通过使用数据节点&#xff0c;可以对数据进行过滤、分组和计算&#xff0c;…

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…

RK3568平台开发系列讲解(驱动篇)RK3568 PWM详解

🚀返回专栏总目录 文章目录 一、什么是PWM二、RK3568 PWM2.1、PWM 通道与引脚2.2、PWM 简介2.3、PWM 设备节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 PWM 是很常用到功能,我们可以通过 PWM 来控制电机速度,也可以使用 PWM 来控制 LCD 的背光亮度。 一、什…

用C++写个示例 linux WebAssembly技术支持的js调用串行通信

C在Linux上通过WebAssembly实现串行通信 以下是一个示例&#xff0c;展示了如何使用C在Linux上通过WebAssembly实现串行通信。这个示例假设你已经安装了Emscripten工具链&#xff0c;并正确配置了你的系统。 首先&#xff0c;创建一个名为serial_communication.cpp的C源文件&…