包含自引用数组的Python类

包含自引用数组的Python类,python,python-3.x,Python,Python 3.x,我有一门课是这样的 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 som

我有一门课是这样的

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.\uu dict\uu

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

首先将这些资产声明为字符串是一个坏主意,尤其是因为(我猜想)您希望使用
DataFrame
来代替它们。第二,您可以使用
map()
/
reduce()
/
filter()
来获得更优雅的方法,但这在很大程度上取决于
\do something
code…而不是将
asset
定义为
john
的属性,为什么不将
定义为(john.carData,john.HouseData):…