Python动态调用函数与属性的三种实现方式

Dylan
Dylan
发布时间:2026-10-14 | 3人浏览过
原创

本文详解Python中动态获取对象属性和方法的三种常用方式。重点解析getattr函数的使用,包括默认值处理及属性与方法同名时的优先级规则;同时展示通过__dict__直接访问属性字典的方法。通过具体代码示例,帮助开发者理解如何在运行时灵活操作对象成员。

使用getattr获取对象属性

在Python中,动态获取对象的属性是常见需求。第一种方法是利用内置函数 getattr(object, name, default=None)。该函数允许通过字符串名称安全地访问对象属性,若指定了default参数,当属性不存在时返回默认值而非抛出异常。


# -*- encoding=utf-8 -*-
class Test:
  def __init__(self):
    self.name = '莉莉'
    self.age = 18
if __name__ == '__main__':
  test = Test()
  name = getattr(test, 'name') # 获取属性
  print(name)
  age = getattr(test, 'age') # 获取属性
  print(age)
  none = getattr(test, 'none', 'none') # 获取不存在的属性,需要添加 default,否则抛异常
  print(none)

代码执行结果如下所示:

莉莉 18 none

使用getattr动态调用方法

除了获取属性,getattr同样适用于动态获取并调用对象的方法。通过传入方法名的字符串,可以获取方法对象,随后进行调用。这种方式实现了基于字符串名称的动态方法调用。


# -*- encoding=utf-8 -*-
class Test:
  def __init__(self):
    self.name = '莉莉'
    self.age = 18

  def get_name(self):
    print('年龄是:{}'.format(self.name))
    return self.name
if __name__ == '__main__':
  test = Test()
  get_name = getattr(test, 'get_name') # 获取方法
  print(get_name)
  get_name() # 调用方法

执行上述代码后,控制台输出如下:

<bound method Test.get_name of <__main__.Test object at 0x000000A6C234DF98>>

年龄是:莉莉

通过__dict__直接访问属性

第三种方式是利用对象的 __dict__ 属性。Python实例通常将属性存储在 __dict__ 字典中,通过直接访问该字典的键值,可以获取属性值。这种方法更底层,直接操作属性存储结构。


# -*- encoding=utf-8 -*-
class Test:
  def __init__(self):
    self.name = '莉莉'
    self.age = 18
if __name__ == '__main__':
  test = Test()
  name = test.__dict__['name']
  print(name)

运行上述代码后,输出结果为:

莉莉

需要注意的是,当类中定义的属性名与方法名相同时,使用 getattr() 函数会优先返回属性值,而非方法对象。这是Python解析成员访问时的默认行为,开发者在动态调用时需留意此优先级差异。

本文介绍了Python中动态访问对象成员的几种核心技巧,涵盖了getattr的安全调用机制及__dict__的直接访问方式。希望这些内容能帮助读者更好地掌握Python的动态特性,提升代码灵活性。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表