python - 在 Python 3 中使用对象属性作为参数
问题描述
我有一个深度优先搜索算法,它从本体中提取信息。
我有一个工作函数来获取具有特定属性的所有对象,但是,我基本上需要为不同的属性做同样的事情。
例如,如果我有这两个简化的功能
def a():
for n in nodes:
do something with n.property1
def b():
for n in nodes:
do something with n.property2
有没有办法可以将所需的属性作为参数传递?所以我最终得到:
def a(property):
for n in nodes:
do something with n.property
a(property1)
a(property2)
解决方案
从技术上讲,是的。getattr()
是一个内置函数,允许您根据对象的名称从对象中获取属性。setattr()
也存在,并且可用于根据属性的名称从对象为属性分配值。
def a(propertyname): # pass property name as a string
for n in nodes:
do something with getattr(n, propertyname)
a('property1')
a('property2')
但是,这通常被认为有点冒险,并且最好以没有必要的方式构造代码。例如,可以使用 lambdas 代替:
def a(getter):
# pass a function that returns the value of the relevant parameter
for n in nodes:
do something with getter()
a(lambda n:n.property1)
b(lambda n:n.property2)
推荐阅读
- python - 如何从直方图中计算每个通道的平均值?
- r - 如何在 R 中制作多图
- react-native - 异步存储数组不保存最后输入的元素
- python - 在 RobotFramework 中可以使用哪些 YAML 关键字来编辑 YAML 文件?
- node.js - 如何在 EC2 上使用 PM2 正确运行多个 nodejs 应用程序?
- email - smtp 和 imap 不支持图形 url 范围
- java - 如何将 Spring Boot 管理服务器和客户端迁移到一个 Spring Boot 应用程序中
- firebase - 获取具有特定子 Firebase Flutter 值的行
- android-mediacodec - 带有 MediaProjection 的 Android MediaCodec
- ssl - 如何检查 kubernetes 令牌和证书密钥的到期时间?