Python动态调用函数与属性的三种实现方式
本文详解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的动态特性,提升代码灵活性。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









