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:
# 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 = 0
    def add(self, value):
        self.value += value
        return self
    def 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 = name
        self.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 = False
    DATABASE_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执行操作
        pass
    else:
        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):
        pass
    for 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_property
    def 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.mfbz.cn/a/560051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型应用开发基础

AGI 时代&#xff0c;AI 无处不在&#xff0c;形成新的社会分层&#xff1a; AI 使用者&#xff0c;使用别人开发的 AI 产品AI 产品开发者&#xff0c;设计和开发 AI 产品基础模型相关&#xff0c;训练基础大模型&#xff0c;或为大模型提供基础设施 越向下层&#xff0c;重要…

ISP图像处理pipeline简介2

上一篇文章介绍了ISP pipeline中的3A和镜头传感器校正。现在继续介绍pipeline中的其它流程。 上一篇文章主要讲了镜头&#xff0c;sensor相关的处理流程&#xff0c;pipeline接下来的一步是颜色插值。 sensor直接输出的图片是raw格式&#xff0c;需要经过isp处理之后才是平时常…

2024燃动智火-业务视角的中国企业AI+学习发展报告

来源&#xff1a;新华三 学习型组织的数字化转型是众多企业关注的焦点&#xff0c;数字战略需要人才升级&#xff0c;数字 化学习加速人才培养。AI 技术在学习中的运用&#xff0c;为企业学习型组织的数字化转型插 上了飞翔的翅膀。这份报告解码了AI 时代企业的学习发展&#…

k8s安装记录

k8s安装记录 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#xff01;&#xff01;&#xff01; 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#xff01;&#xff01;&#xff01; 如无特别说明&#xff0c;则该步操作指在所有的机器上执行&#…

(C语言入门)数组

目录 什么是数组&#xff1f; 数组&#xff1a; 数组的使用&#xff1a; 数组的初始化&#xff1a; 数组名&#xff1a; 数组案例&#xff1a; 一维数组的最大值&#xff1a; 一维数组的逆置&#xff1a; 数组和指针&#xff1a; 通过指针操作数组元素&#xff1a; …

从技术层面探讨小程序智能名片商城系统中的AI、ERP、OA、SCRM技术应用

随着信息技术的迅猛发展&#xff0c;智能名片商城系统已逐渐成为现代商业运营不可或缺的重要工具。AI、ERP、OA、SCRM等多种技术的融合应用&#xff0c;不仅提升了商城的运营效率和用户体验&#xff0c;更为商家带来了前所未有的商业价值。下面&#xff0c;我们将结合具体案例&…

用栈实现队列(力扣第232题)

#define _CRT_SECURE_NO_WARNINGS 1 #include "assert.h" #include "stdio.h" #include "stdbool.h" #include "stdlib.h" #include "string.h" #define N 10 typedef int STDataType; int data; //静态栈 //typedef struct…

【加密周报】中东“惊雷”炸响币圈!比特币减半成功完成,市场情绪已被提前消化!中美突传USDT重磅消息!

周五(4月19日)&#xff0c;比特币经历惊魂一刻&#xff0c;伊朗核设施所处的中部城市伊斯法罕惊传爆炸&#xff0c;叙利亚与伊拉克也都传来爆炸声响&#xff0c;中东全面战争与核武攻击威胁触发加密市场恐慌情绪。比特币一度下探59600美元。但随后伊朗强调核设施未受损&#xf…

K8S哲学 - probe 探针

探针分类&#xff1a; liveness probe readiness probe startup probe Liveness Probe&#xff1a;用于检查容器是否还在运行。如果 Liveness Probe 失败&#xff0c;Kubernetes 会杀死容器&#xff0c;然后根据你的重启策略来决定是否重新启动容器。常见的做法是使用与 Readin…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 &#xff0c; System ILA 核已被废 弃。现在 &#xff0c; 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

流媒体协议--RTMP

文章目录 RTMP播放基本流程TCP握手过程RTMP握手过程connect连接createStream 创建流play 播放命令deleteStream删除流RTMP数据组成 RTMP(Real Time Messaging Protocol)是一个应用层协议&#xff0c;主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议…

Flutter 热修复(Shorebird)

Shorebird&#xff1a;https://docs.shorebird.dev/ 我们都知道安卓原生开发&#xff0c;热修复已经不是什么难题。阿里云&#xff0c;腾讯云已经都有现成的SDK可以接入。 然而Flutter开发还一直没有类似热修复的开发库&#xff0c;无意中看到了Shorebird这个平台&#xff0c…

【电子通识】焊接的原理、技巧与注意事项

在【电子通识】烙铁使用方法 中我们讲到烙铁是硬件工程师最经常使用的工具之一&#xff0c;一把性能保持良好的烙铁能帮助我们快速进行电路调试。并且提供了一些与烙铁有关的周边知识、保养和使用注意事项等。 本文章是基于有技巧 &#xff01;小姐姐带你玩焊接&#xff01;进行…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源&#xff0c;会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站&#xff0c;以拓宽你的创作视野&#xff0c;帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府&#xff08;中国&#xff09; 提供各种类别的优质高清视频素…

音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

文章目录 1. H264编码参数2. H264编码原理2.1 压缩原理2.2 编码结构解析 3. NALU结构4. H264 annexb模式5. 补充说明5.1 I帧5.2 P帧5.3 B帧 1. H264编码参数 视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下&#xff0c;视频流占⽤的带宽越⾼则视频质量也越⾼&#xff0c;需要的…

继电器工作原理、主要选型参数及应用电路详解

继电器具有输入回路和输出回路&#xff0c;通常应用于自动控制电路中。继电器实际上是用较小的电流去控制较大电流的一种“自动开关”。 工作原理 继电器的工作原理基于电磁效应。电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成。当线圈两端加上一定的电压时&#xff0c;…

CSS基础:盒子模型详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 We…

基于Kubernetes集群构建MongoDB

基于Kubernetes集群构建MongoDB 作者:行癫(盗版必究) 一:基础环境 1.Kubernetes集群正常运行 2.Harbor私有仓库正常运行 二:MongoDB项目部署 ​ MongoDB项目对应Kubernetes的yaml文件: --- apiVersion: v1 kind: Namespace metadata:name: m

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言&#xff1a;探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库&#xff1a;地址&#xff0c;本博客对应01文件夹。 序言&#xff1a;探索人工智能的新篇章 随着人工智能技术的飞速发展&#xff0c;ChatGPT作为…

ruoyi element-ui 实现拖拉调整图片顺序

ruoyi element-ui 实现拖拉调整图片顺序 安装sortablejs https://sortablejs.com/npm 安装sortablejs npm install sortablejs --save相关options var sortable new Sortable(el, {group: "name", // or { name: "...", pull: [true, false, clone, …
最新文章