python - 包含自引用数组的 Python 类
问题描述
我有这样的课...
class person:
def __init__(self, name):
self.name = name
self.carData = ""
self.HouseData = ""
#other assets
我正在像这样循环遍历它......
john = person('John');
for index, row in john.carData.iterrows():
#do something
for index, row in john.HouseData.iterrows():
#do something
但在这种情况下,“做某事”是重复的代码——我想对 carData、HouseData 和一个人可以拥有的所有其他资产做同样的事情。
以非重复方式循环遍历这些的最佳方法是什么?我在类定义中考虑过这样的事情,但我很确定它至少不优雅而且可能是错误的......
class person:
def __init__(self, name):
self.name = name
self.carData = ""
self.HouseData = ""
#other assets
self.assets = [self.carData, self.HouseData etc]
john = person('John');
for asset in john.assets:
for index, row in asset.iterrows():
#do something
定义一个对象列表(在本例中为 self.assets)本身引用存储在类中的相同对象是一种不好的做法吗?抱歉,如果这含糊不清 - 我只是想找出处理这种情况的最干净的方法。
解决方案
如果您计划对对象的每个属性应用相同的代码,您可以尝试john.__dict__
:
john = person('John')
for attr, value in john.__dict__.items():
# e.g. attr == 'carData'
for index, row in value.iterrows():
# do something
看到这个问题。
这有点骇人听闻,但是如果(例如)您想将代码应用于除“name”之外的每个属性,请执行以下操作:
john = person('John')
for attr, value in john.__dict__.items():
# e.g. attr == 'carData'
if attr != 'name':
for index, row in value.iterrows():
# do something
推荐阅读
- java - 日历给出错误的日期
- gradle - 为什么 Gradle 构建因 java11 和 jfreechart 依赖而失败?
- javascript - 使用 ASP.NET Web API 在 Angular 6 中下载文件
- python - 使用正则表达式或任何其他方法从电子邮件字符串中提取所有日期模式的最佳方法?
- java - Chrome 如何在可绘制对象中将文本添加到选项卡切换器?
- drone.io - 如何将 Drone 与自托管 git 存储库一起使用
- jquery - 为什么动画不适用于 IE 中的鼠标滚动但适用于平滑滚动
- selenium - 使用 chrome.tabCapture.capture 时“未找到请求的设备”
- python - IntegerField 上的烧瓶默认值
- angular - 创建 Angular 服务的 NPM 包的正确方法