Python-VBA函数之旅-getattr函数

目录

一、getattr函数的常见应用场景:    

二、getattr函数使用注意事项:

1、getattr函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421



一、getattr函数的常见应用场景:    

        getattr函数在 Python 中有许多实际应用场景,尤其是在处理对象属性、动态访问属性、实现灵活的 API 和框架等方面。常见的应用场景有:

1、动态属性管理:当你不确定一个对象是否有某个属性,或者属性名在运行时才能确定时,可以使用getattr()函数。例如,在处理配置文件或用户输入时,你可能需要根据这些动态信息来访问对象的属性。

2、实现可选参数或默认值:在某些情况下,你可能想为对象的属性提供默认值,以防该属性不存在。getattr()函数的 “default” 参数非常适合这种情况。

3、实现灵活的API:在构建API或库时,你可能希望允许用户通过字符串来访问函数或方法,而不是直接调用它们。这可以通过将函数或方法作为对象的属性,并使用getattr()函数来实现。

4、插件和扩展系统:在构建可扩展的系统时,getattr()函数可以用于动态加载和执行插件或扩展。例如,一个框架可能允许用户通过添加具有特定方法的对象来扩展其功能。

5、配置文件和设置管理:在处理配置文件或应用程序设置时,getattr()函数可以用来动态地获取配置选项的值。这允许你在不修改代码的情况下更改配置,并使代码更加模块化和可维护。

6、与外部库或模块交互:当与外部库或模块交互时,你可能不知道它们的确切属性或方法名称,或者这些名称可能在不同的版本中有所变化。使用getattr()函数可以使你的代码更加灵活和健壮,因为它允许你动态地访问这些属性或方法。

7、动态类创建:结合type()函数,你可以使用getattr()函数动态地创建类。

8、结合装饰器使用:你可以使用装饰器和getattr()函数结合来动态地添加或修改对象的属性或方法。

        总之,由于 Python 的动态性,getattr()函数的应用非常广泛,几乎可以在任何需要动态访问或操作对象属性的地方使用。

二、getattr函数使用注意事项:

        在使用 Python 中的getattr()函数时,需注意以下事项:

1、异常处理:如果尝试获取的对象没有指定的属性,并且没有提供 `default` 参数,`getattr()` 会引发 `AttributeError`。因此,你应该始终准备好处理这种异常,或者使用 `default` 参数来避免它。

2、属性名称作为字符串:getattr()函数的第二个参数必须是字符串,表示要获取的属性的名称。如果你传递了非字符串类型的参数,会引发 `TypeError`。

3、区分方法和属性:如果你使用getattr()函数获取的是一个方法而不是一个属性,你需要记得调用这个方法(加上括号),否则,你会得到一个方法对象而不是它的返回值。

4、安全性和权限:在使用getattr()函数访问对象的属性时,要注意不要违反封装原则或访问不应该被外部访问的属性。如果对象的设计意图是隐藏某些属性或方法,你应该尊重这一点,并仅通过对象提供的公共接口进行交互。

5、避免过度使用:虽然getattr()函数提供了很大的灵活性,但过度使用它可能会使代码难以理解和维护。在大多数情况下,直接访问对象的属性或调用方法更加清晰和直接。只有在确实需要动态访问属性或实现某种特定逻辑时,才应使用getattr()函数。

6、与对象特殊方法的区别:getattr()函数是一个内置函数,用于从对象中获取属性。而 `__getattr__` 和 `__getattribute__` 是对象的特殊方法,用于在属性访问失败时定义自定义行为。它们通常在类定义中使用,而不是在普通的代码逻辑中。在使用这些特殊方法时要特别小心,因为它们会改变对象属性访问的基本行为。

1、getattr函数:
1-1、Python:
python"># 1.函数:getattr
# 2.功能:用于获取对象的属性值
# 3.语法:getattr(object, name [,default])
# 4.参数:
# 4-1、object:必须,对象。Python内置了一些基本的对象类型,包括但不限于:
#   4-1-1、 数字(Numbers):# int:整数# float:浮点数# complex:复数
#   4-1-2、 序列(Sequences):# list:列表,可以包含任意类型的元素# tuple:元组,与列表类似但不可变# str:字符串,字符序列# bytes:字节序列# bytearray:可变字节序列# memoryview:内存视图,是原始数据的不同解释
#   4-1-3、集合(Sets):# set:无序且不包含重复元素的集合# frozenset:不可变的集合
#   4-1-4、映射(Mappings):# dict:字典,键值对映射
#   4-1-5、布尔值(Booleans):# bool:布尔类型,只有两个值:True和False
#   4-1-6、类型(Types):# type:类型对象,用于描述其他对象的数据类型
#   4-1-7、其他内置类型:# NoneType:只有一个值None,表示空或没有值# ellipsis:...,通常用于切片操作或表示省略# slice:表示切片对象,用于切片操作# range:表示不可变的整数序列,通常用于循环# property:用于获取、设置或删除属性的内置装饰器类型# function:函数对象# method:方法对象,即绑定到类实例的函数# classmethod和staticmethod:特殊的方法类型,分别表示类方法和静态方法# module:模块对象# traceback、frame和code:与异常和调试相关的对象
# 4-2. name:必须,字符串,对象属性
# 4-3、default:可选,默认返回值,若不提供该参数,在没有对应属性时,将触发AttributeError错误
# 5.返回值:返回对象属性
# 6.说明:
# 7.示例:
# 应用1:动态属性管理
# 访问对象属性
class MyClass:def __init__(self):self.my_attribute = "Hello, Python!"
obj = MyClass()
# 使用getattr访问属性
attribute_value = getattr(obj, 'my_attribute')
print(attribute_value)
# Hello, Python!# 灵活处理属性不存在的情况
class MyClass:def __init__(self):self.existing_attribute = "I exist!"
obj = MyClass()
# 尝试访问一个不存在的属性,使用default参数来避免AttributeError
attribute_value = getattr(obj, 'non_existing_attribute', 'Default value')
print(attribute_value)
# Default value# 动态调用方法
class MyClass:def say_hello(self):print("Hello!")def say_goodbye(self):print("Goodbye!")
obj = MyClass()
# 根据用户输入动态调用方法
method_name = input("Enter method name (say_hello or say_goodbye): ")
if hasattr(obj, method_name):getattr(obj, method_name)()
else:print(f"No such method: {method_name}")
# Enter method name (say_hello or say_goodbye): say_hello
# Hello!# 处理嵌套对象
class InnerClass:def __init__(self):self.value = "Inner value"
class OuterClass:def __init__(self):self.inner = InnerClass()
obj = OuterClass()
# 使用getattr访问嵌套对象的属性
inner_value = getattr(getattr(obj, 'inner'), 'value')
print(inner_value)
# Inner value# 动态设置属性
class MyClass:pass
obj = MyClass()
# 使用setattr动态设置属性
setattr(obj, 'new_attribute', 'This is a new attribute')
# 使用getattr获取刚刚设置的属性
attribute_value = getattr(obj, 'new_attribute')
print(attribute_value)
# This is a new attribute# 实现链式调用
class Chainable:def __init__(self):self.value = 0def add(self, value):self.value += valuereturn selfdef result(self):return self.value
obj = Chainable()
result = getattr(getattr(obj, 'add')(5), 'add')(10).result()
print(result)
# 15# 应用2:实现可选参数或默认值
class User:def __init__(self, name):self.name = nameself.age = None
user = User("Myelsa")
age = getattr(User, "age", 18)  # 如果age不存在,则返回18
print(age)
# 18# 应用3:实现灵活的API
class API:def method1(self):return "Method 1 called"def method2(self):return "Method 2 called"
api = API()
method_name = input("请输入要调用的方法名(method1 或 method2):")
result = getattr(api, method_name, lambda: "Invalid method")()
print(result)
# 请输入要调用的方法名(method1 或 method2):method1
# Method 1 called# 应用4:插件和扩展系统
import os
class PluginBase:def execute(self):raise NotImplementedError("Subclasses must implement this!")
plugins = []
def load_plugins(directory):for filename in os.listdir(directory):if filename.endswith(".py"):module_name = os.path.splitext(filename)[0]module = importlib.import_module(f"plugins.{module_name}")for attr_name in dir(module):attr = getattr(module, attr_name)if isinstance(attr, type) and issubclass(attr, PluginBase):plugins.append(attr())
def run_plugins():for plugin in plugins:plugin.execute()
# 加载并执行插件
load_plugins("plugins_myelsa") # 假设存在插件plugins_myelsa
run_plugins()# 应用5:配置文件和设置管理
class Config:DEBUG = FalseDATABASE_URL = 'sqlite:///db.sqlite3'
config = Config()
debug_mode = getattr(config, 'DEBUG', False)
database_url = getattr(config, 'DATABASE_URL', 'default_database_url')# 应用6:与外部库或模块交互
def interact_with_external_module(module_name, attribute_name):module = __import__(module_name)attribute = getattr(module, attribute_name, None)if attribute:# 使用attribute执行操作passelse:print(f"Attribute {attribute_name} not found in module {module_name}")# 应用7:动态类创建
def dynamic_class_factory(class_name, base_class, attribute_dict):class Meta(base_class):passfor name, value in attribute_dict.items():setattr(Meta, name, value)return Meta
attribute_dict = {'my_attribute': 'Hello, world!'}
DynamicClass = dynamic_class_factory('DynamicClass', object, attribute_dict)
instance = DynamicClass()
print(getattr(instance, 'my_attribute'))
# Hello, world!# 应用8:结合装饰器使用
def dynamic_property(func):def wrapper(self, *args, **kwargs):attr_name = '_' + func.__name__if not hasattr(self, attr_name):setattr(self, attr_name, func(self, *args, **kwargs))return getattr(self, attr_name)return wrapper
class MyClass:@dynamic_propertydef expensive_calculation(self):print("Calculating...")return 42
obj = MyClass()
print(obj.expensive_calculation)
print(obj.expensive_calculation)
# <bound method dynamic_property.<locals>.wrapper of <__main__.MyClass object at 0x000002254717D850>>
# <bound method dynamic_property.<locals>.wrapper of <__main__.MyClass object at 0x000002254717D850>>
1-2、VBA:
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-bytearray()函数

2-2、Python-VBA函数之旅-bytes()函数 

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:神奇夜光杯-CSDN博客

http://www.ppmy.cn/news/1434598.html

相关文章

Linux进程详解三:进程状态

文章目录 进程状态Linux下的进程状态运行态-R阻塞态浅度休眠-S深度睡眠-D暂停状态-T暂停状态-t 终止态僵尸-Z死亡-X 孤儿进程 进程状态 进程的状态&#xff0c;本质上就是一个整型变量&#xff0c;在task_struct中的一个整型变量。 状态的存在决定了你的后续行为动作。 Linu…

【Linux】日志分析与管理

作为一个运维&#xff0c;如果不会看日志&#xff0c;就好比是冬天刚刚用热水泡完了脚&#xff0c;接着就立马让人把水喝掉。 目录 一、Inode介绍 1.1 什么是inode 1.2 inode表内容 1.3 查看inode号的方式 二、日志分析 2.1 日志的用途 2.2 日志的分类 2.3 日志级别 2…

maya显示隐藏 动画长度

目录 大纲视图&#xff0c;选择节点&#xff0c;H控制显示与隐藏 使用Viewport显示/隐藏 脚本控制显示/隐藏 获取动画长度python脚本 大纲视图&#xff0c;选择节点&#xff0c;H控制显示与隐藏 使用Viewport显示/隐藏 这是最直观的方法&#xff0c;适合临时隐藏Mesh以便专…

EelasticSearch的docker安装-----》es客户端使用!!!

1.Docker安装 docker run -d --name es7 -e ES_JAVA_POTS"-Xms256m -Xmx256m" -e "discovery.typesingle-node" -v /opt/es7/data/:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 elasticsearch:7.14.02.客户端UI工具&#xff0c;Edge浏览器…

北航计算机软件技术基础课程作业笔记【4】

题目&#xff08;好像以前没加&#xff09; 二叉树与哈希表 作业 1.二叉树前序遍历结果 二叉树结构为 代码实现中序后序推理前序表达式 #include <iostream> #include <stack> #include <string> #include <vector> #include <deque> ​ // …

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

webview的使用方法和后退键的处理

WebView是一个能够显示网页内容的控件&#xff0c;通常用于Android或iOS应用程序中嵌入网页。下面我将分别说明WebView在Android和iOS中的使用方法&#xff0c;以及如何处理后退键。 Android中的WebView使用方法 添加WebView到布局文件中 在你的布局XML文件中添加WebView控件…

Linux 的情况下实现贪吃蛇 -- 第二十八天

1.keypad(stdsrc,1) 参数表示是否接收&#xff0c;1表示接收指令 2.思路&#xff1a;初始化initNcurses()&#xff0c; 封装地图函数实现地图gamePic&#xff08;&#xff09; 分三部分实现&#xff1a;2.1: 在第0行&#xff1a;打印 "--"," | "和&q…

【JavaScript编程实操14】DOM实操_回到顶部

前言 本次主要是针对Javascript阶段的DOM实操方面的练习&#xff0c;本次主要实现当页面内容过多时&#xff0c;可以点击按钮&#xff0c;快速回到页面顶部的效果。这次的实现逻辑比较简单&#xff0c;主要是应用函数实现页面的回到顶部功能&#xff0c;this.scrollTo(0, 0)可以…

完美解决多种情况下的 java.lang.NullPointerException 的异常

文章目录 1. 复现错误2. 分析问题3. 解决问题1. 复现错误 在工作中,经常会遇见java.lang.NullPointerException的异常,这种异常千奇百怪,但明确一点的是:它是空指针异常,也称之为NPE异常,如下代码所示: @Setter @Getter @Accessors(chain = true) public class Student…

10.Java集合汇总

文章目录 1. Java集合概述1.1 Java集合框架概述1.2 Collection接口继承树1.3 Map接口继承树 2. Collection接口2.1 Collection接口方法 3 Iterator迭代器接口3.1 Iterator接口的方法3.2 foreach循环 4 List接口4.1 List接口方法4.1 ArrayList4.2 LinkedList4.3 Vector4.4 面试题…

【vim】折叠代码

目录 简介操作创建折叠删除折叠打开或关闭折叠在折叠间移动简介 Vim编辑器中可以使用 foldmethod 选项设置折叠方法。 将 foldmethod 设置为 manual 以外的值时,将删除所有折叠并创建新折叠。切换到 manual 方法不会删除现有的折叠。由此可以先用自动定义折叠,然后手动更改它…

redmibook 14 2020 安装 ubuntu

1. 参考博客 # Ubuntu20.10系统安装 -- 小米redmibook pro14 https://zhuanlan.zhihu.com/p/616543561# ubuntu18.04 wifi 问题 https://blog.csdn.net/u012748494/article/details/105421656/# 笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠 https://blog.csdn.net/…

[蓝桥杯 2018 省 A] 航班时间

题目链接&#xff1a;航班时间 显然&#xff1a;去程时间飞行时间时差&#xff0c;回程时间飞行时间-时差 列方程组可知&#xff1a;飞行时间&#xff08;去程时间回程时间&#xff09;/2 本道题目还有一个难点在于如何读入和输出&#xff1a;可以采用scanf&#xff08;&…

el-select下拉框远程搜索且多选时,编辑需要回显的一个简单案例

前端业务开发中不管使用vue2~3&#xff0c;还是react&#xff0c;angular各种前端技术栈&#xff0c;经常会遇到这种业务。一个下拉框Select中&#xff0c;不仅需要需要支持远程模糊搜索&#xff0c;还需要支持多选。并且在编辑时&#xff0c;还能正常把已经多选好的内容回显到…

有哪些网络连接方式?

网络连接方式多种多样&#xff0c;大家常常对各类连接方式感到困惑&#xff0c;难以区分。以下是从连接形式和用途的角度分类的几种主要网络连接方式&#xff1a; 按连接形式分类 1、有线连接&#xff1a; 以太网连接&#xff1a;使用双绞线或同轴电缆&#xff0c;常见于局域…

「JavaEE」线程状态

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 线程状态 &#x1f349;start 和 run 的区别&#x1f349;终止线程&#x1f349;join & 阻塞状态&#x1f349;线程六大状态 &…

开源AI Agent框架的选择

在选择开源AI Agent框架时,首先需要考虑的是框架的开发优先级、功能特性以及社区支持情况。SuperAGI是一个开发者优先的开源自主AI代理框架,它使开发人员能够快速可靠地构建、管理和运行有用的代理12。这表明SuperAGI可能是一个适合需要快速迭代和高度自定义能力的项目的良好…

Springboot+Vue项目-基于Java+MySQL的图书馆管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

低视力者出行升级:适配服务助力双手解放与环境感知

作为一名资深记者&#xff0c;我有幸深入了解并记录低视力者在日常出行中所面临的挑战与解决方案。近年来&#xff0c;低视力者辅助设备适配服务提供领域的创新成果&#xff0c;尤其是结合手机应用的辅助设备&#xff0c;正在以人性化、智能化的方式&#xff0c;帮助低视力者实…