python getattr的美妙生活

本文详细介绍了Python内置函数getattr的用法,包括如何通过字符串获取对象属性,以及__getattr__魔法方法的应用。并通过实例展示了常见错误及解决办法。

一、简介

  • 1、getattr是Python的内置函数
  • 2、用法getattr(object,“attribution”,None)
    • object: 对象
    • attribution:实例方法、或者类方法(object是一个类对象的时候)必须是str
    • None:默认值,如果没有attribution,或者没有返回值,返回默认值
一句话简介:拿到对象是的该属性

二、实例

class Test:
    age = 10

    def __init__(self):
        self.name = 'Donald'

    @staticmethod
    def sex():
        return 'man'


print(getattr(Test, 'age'))
print(getattr(Test, 'sex')())

-----
10
man
  • 1、以上是类对象,很好办,再来一个例子
a = {}
a['hello'] = 'world'
print(getattr(a, 'hello'))
-----
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'hello'
  • 2、a是一个字典对象,传入hello为什么报错?因为hello并不是a的属性,可以使用dir()查看属性:
print(dir(a))
-----
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
****
print(getattr(a, '__str__'))
print(getattr(a, '__str__')())
-----
<method-wrapper '__str__' of dict object at 0x10661faf8>
"{'hello': 'world'}"
  • 3、如果不加括号,返回的是一串内存地址,正常显示需要想调用函数一样加上()

三、扩展

__getattr__方法
  • 1 在Python中以__开头的称为魔法方法或专用方法,也有一个__getattr__方法。
  • 2 改方法仅当属性不能在实例的__dict__或其父类的 __dict__中找到时,才被调用。
class Test:
    age = 10

    def __init__(self):
        self.name = 'Donald'

    @staticmethod
    def sex():
        print('in sex')
        return 'man'

    def __str__(self):
        print('in str')
        return str(self.name)

    def __getattr__(self, item):
        return f'{item},没有这个属性,访问错误'


if __name__ == '__main__':
    p = Test()
    print(p.age)
    print(p)
    print(p.sex())
    print(p.sss)

-----
10
in str
Donald
in sex
man
sss,没有这个属性,访问错误

-3、在访问实例sss的时候,因为在实例对象和类的__dict__都找到不到,所以会调用该函数

### 如何在编程模块中正确导入或引用另一个模块 #### Python 中的模块导入 在 Python 编程中,可以通过多种方式实现模块之间的相互引用。以下是几种常见的方法: 1. **绝对导入** 绝对导入是指通过完整的路径来指定目标模块的位置。这种方式的优点在于清晰明了,不容易引发命名冲突。例如: ```python from subA.A import A # 导入位于subA目录下的A模块中的A类 ``` 2. **相对导入** 相对导入则是基于当前模块所在的路径来进行模块定位。需要注意的是,相对导入仅适用于包内的模块间引用,且不能直接运行带有相对导入的脚本文件[^2]。例如: ```python from ..subA.A import A # 表示向上一层目录找到subA/A.py并导入其中的A类 ``` 3. **动态导入 (importlib)** 如果需要在运行时决定加载哪个模块,则可以使用 `importlib` 提供的动态导入功能。这种方法特别适合处理不确定性的需求场景[^5]。例如: ```python import importlib module_name = 'subA.A' module = importlib.import_module(module_name) A_class = getattr(module, 'A') instance = A_class() ``` 4. **环境变量配置** 对于跨文件夹甚至跨项目的复杂依赖关系,调整系统的 PYTHONPATH 或者手动向 sys.path 添加对应路径也是一种解决方案[^5]。例如: ```python import sys import os current_dir = os.path.dirname(os.path.abspath(__file__)) target_path = os.path.join(current_dir, '..', 'another_package') # 假设目标模块在此处 sys.path.append(target_path) import some_module_in_another_package ``` #### Node.js 的模块导入机制 相比之下,Node.js 处理模块间的互相引用更加直观简单。只需利用 CommonJS 规范提供的 `require()` 函数即可完成基本操作[^1]。 假设存在两个 JavaScript 文件分别为 a.js 和 b.js 并希望让后者能够访问前者的内容,则可以在 b.js 内部写成如下形式: ```javascript // b.js const a = require('./a'); console.log(a.someFunction()); ``` 与此同时,为了使其他地方也能顺利获取到该对象实例,在导出端需显式声明哪些部分可供外部消费: ```javascript // a.js module.exports = { someVariable: 'value', someFunction() { return this.someVariable; } }; ``` --- ### 注意事项 无论是哪种语言环境下进行模块管理都需要遵循一定的原则以减少潜在错误的发生几率: - 避免循环依赖; - 尽量保持单一职责分离关注点; - 合理规划项目结构以便维护扩展方便快捷高效稳定可靠安全兼容性强易理解可移植性好成本低廉性价比高使用寿命长久抗风险能力强适应变化迅速灵活多样创新进取不断进步持续改进优化升级迭代更新换代推陈出新永葆青春活力充满生机勃勃欣欣向荣蒸蒸日上的美好未来前景光明灿烂辉煌无比!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值