首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-getattr函数

  • 25-03-03 04:24
  • 2823
  • 11801
blog.csdn.net

目录

一、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. # 1.函数:getattr
  2. # 2.功能:用于获取对象的属性值
  3. # 3.语法:getattr(object, name [,default])
  4. # 4.参数:
  5. # 4-1、object:必须,对象。Python内置了一些基本的对象类型,包括但不限于:
  6. # 4-1-1、 数字(Numbers):
  7. # int:整数
  8. # float:浮点数
  9. # complex:复数
  10. # 4-1-2、 序列(Sequences):
  11. # list:列表,可以包含任意类型的元素
  12. # tuple:元组,与列表类似但不可变
  13. # str:字符串,字符序列
  14. # bytes:字节序列
  15. # bytearray:可变字节序列
  16. # memoryview:内存视图,是原始数据的不同解释
  17. # 4-1-3、集合(Sets):
  18. # set:无序且不包含重复元素的集合
  19. # frozenset:不可变的集合
  20. # 4-1-4、映射(Mappings):
  21. # dict:字典,键值对映射
  22. # 4-1-5、布尔值(Booleans):
  23. # bool:布尔类型,只有两个值:True和False
  24. # 4-1-6、类型(Types):
  25. # type:类型对象,用于描述其他对象的数据类型
  26. # 4-1-7、其他内置类型:
  27. # NoneType:只有一个值None,表示空或没有值
  28. # ellipsis:...,通常用于切片操作或表示省略
  29. # slice:表示切片对象,用于切片操作
  30. # range:表示不可变的整数序列,通常用于循环
  31. # property:用于获取、设置或删除属性的内置装饰器类型
  32. # function:函数对象
  33. # method:方法对象,即绑定到类实例的函数
  34. # classmethod和staticmethod:特殊的方法类型,分别表示类方法和静态方法
  35. # module:模块对象
  36. # traceback、frame和code:与异常和调试相关的对象
  37. # 4-2. name:必须,字符串,对象属性
  38. # 4-3、default:可选,默认返回值,若不提供该参数,在没有对应属性时,将触发AttributeError错误
  39. # 5.返回值:返回对象属性
  40. # 6.说明:
  41. # 7.示例:
  42. # 应用1:动态属性管理
  43. # 访问对象属性
  44. class MyClass:
  45. def __init__(self):
  46. self.my_attribute = "Hello, Python!"
  47. obj = MyClass()
  48. # 使用getattr访问属性
  49. attribute_value = getattr(obj, 'my_attribute')
  50. print(attribute_value)
  51. # Hello, Python!
  52. # 灵活处理属性不存在的情况
  53. class MyClass:
  54. def __init__(self):
  55. self.existing_attribute = "I exist!"
  56. obj = MyClass()
  57. # 尝试访问一个不存在的属性,使用default参数来避免AttributeError
  58. attribute_value = getattr(obj, 'non_existing_attribute', 'Default value')
  59. print(attribute_value)
  60. # Default value
  61. # 动态调用方法
  62. class MyClass:
  63. def say_hello(self):
  64. print("Hello!")
  65. def say_goodbye(self):
  66. print("Goodbye!")
  67. obj = MyClass()
  68. # 根据用户输入动态调用方法
  69. method_name = input("Enter method name (say_hello or say_goodbye): ")
  70. if hasattr(obj, method_name):
  71. getattr(obj, method_name)()
  72. else:
  73. print(f"No such method: {method_name}")
  74. # Enter method name (say_hello or say_goodbye): say_hello
  75. # Hello!
  76. # 处理嵌套对象
  77. class InnerClass:
  78. def __init__(self):
  79. self.value = "Inner value"
  80. class OuterClass:
  81. def __init__(self):
  82. self.inner = InnerClass()
  83. obj = OuterClass()
  84. # 使用getattr访问嵌套对象的属性
  85. inner_value = getattr(getattr(obj, 'inner'), 'value')
  86. print(inner_value)
  87. # Inner value
  88. # 动态设置属性
  89. class MyClass:
  90. pass
  91. obj = MyClass()
  92. # 使用setattr动态设置属性
  93. setattr(obj, 'new_attribute', 'This is a new attribute')
  94. # 使用getattr获取刚刚设置的属性
  95. attribute_value = getattr(obj, 'new_attribute')
  96. print(attribute_value)
  97. # This is a new attribute
  98. # 实现链式调用
  99. class Chainable:
  100. def __init__(self):
  101. self.value = 0
  102. def add(self, value):
  103. self.value += value
  104. return self
  105. def result(self):
  106. return self.value
  107. obj = Chainable()
  108. result = getattr(getattr(obj, 'add')(5), 'add')(10).result()
  109. print(result)
  110. # 15
  111. # 应用2:实现可选参数或默认值
  112. class User:
  113. def __init__(self, name):
  114. self.name = name
  115. self.age = None
  116. user = User("Myelsa")
  117. age = getattr(User, "age", 18) # 如果age不存在,则返回18
  118. print(age)
  119. # 18
  120. # 应用3:实现灵活的API
  121. class API:
  122. def method1(self):
  123. return "Method 1 called"
  124. def method2(self):
  125. return "Method 2 called"
  126. api = API()
  127. method_name = input("请输入要调用的方法名(method1 或 method2):")
  128. result = getattr(api, method_name, lambda: "Invalid method")()
  129. print(result)
  130. # 请输入要调用的方法名(method1 或 method2):method1
  131. # Method 1 called
  132. # 应用4:插件和扩展系统
  133. import os
  134. class PluginBase:
  135. def execute(self):
  136. raise NotImplementedError("Subclasses must implement this!")
  137. plugins = []
  138. def load_plugins(directory):
  139. for filename in os.listdir(directory):
  140. if filename.endswith(".py"):
  141. module_name = os.path.splitext(filename)[0]
  142. module = importlib.import_module(f"plugins.{module_name}")
  143. for attr_name in dir(module):
  144. attr = getattr(module, attr_name)
  145. if isinstance(attr, type) and issubclass(attr, PluginBase):
  146. plugins.append(attr())
  147. def run_plugins():
  148. for plugin in plugins:
  149. plugin.execute()
  150. # 加载并执行插件
  151. load_plugins("plugins_myelsa") # 假设存在插件plugins_myelsa
  152. run_plugins()
  153. # 应用5:配置文件和设置管理
  154. class Config:
  155. DEBUG = False
  156. DATABASE_URL = 'sqlite:///db.sqlite3'
  157. config = Config()
  158. debug_mode = getattr(config, 'DEBUG', False)
  159. database_url = getattr(config, 'DATABASE_URL', 'default_database_url')
  160. # 应用6:与外部库或模块交互
  161. def interact_with_external_module(module_name, attribute_name):
  162. module = __import__(module_name)
  163. attribute = getattr(module, attribute_name, None)
  164. if attribute:
  165. # 使用attribute执行操作
  166. pass
  167. else:
  168. print(f"Attribute {attribute_name} not found in module {module_name}")
  169. # 应用7:动态类创建
  170. def dynamic_class_factory(class_name, base_class, attribute_dict):
  171. class Meta(base_class):
  172. pass
  173. for name, value in attribute_dict.items():
  174. setattr(Meta, name, value)
  175. return Meta
  176. attribute_dict = {'my_attribute': 'Hello, world!'}
  177. DynamicClass = dynamic_class_factory('DynamicClass', object, attribute_dict)
  178. instance = DynamicClass()
  179. print(getattr(instance, 'my_attribute'))
  180. # Hello, world!
  181. # 应用8:结合装饰器使用
  182. def dynamic_property(func):
  183. def wrapper(self, *args, **kwargs):
  184. attr_name = '_' + func.__name__
  185. if not hasattr(self, attr_name):
  186. setattr(self, attr_name, func(self, *args, **kwargs))
  187. return getattr(self, attr_name)
  188. return wrapper
  189. class MyClass:
  190. @dynamic_property
  191. def expensive_calculation(self):
  192. print("Calculating...")
  193. return 42
  194. obj = MyClass()
  195. print(obj.expensive_calculation)
  196. print(obj.expensive_calculation)
  197. # .wrapper of <__main__.MyClass object at 0x000002254717D850>>
  198. # .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博客
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览61139 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/137987118"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top