Передача списка потенциальных объектов в класс, который будет создан

#python #pandas #class #instance

Вопрос:

Кажется, я не могу понять, что, по моему мнению, должно быть простой операцией для создания экземпляра некоторого произвольного списка (или другого контейнера, который может изменяться со временем) созданного мной класса. Пример воспроизведения:

 import pandas as pd  df = pd.DataFrame([['helen', 'peanut', 3],['helen', 'butter', 7],['agnes', 'tuna', 5]], columns=['registered_to', 'cat_name', 'sale_price'])  cat_owners = df.registered_to.unique()  class CatOwner():  def __init__(self, name):  self.name=name  self.spent_on_cats = df.loc[df.registered_to==name]['sale_price'].sum()  for owner in cat_owners:  owner = CatOwner(owner) # I know this doesn't work.  

cat_owners = [CatOwner(name) for name in cat_owners] #this gets me close (спасибо за предложение @Tim Roberts), но еще не пришло. helen.spent_on_cats #желаемый результат = 10, вместо ошибки cat_owners.helen.spent_on_cats #если бы мне пришлось сделать это таким образом, это было бы прекрасно, но это также не работает (предпочтительный первый способ), ошибка

Спасибо за помощь!

Ответ №1:

Понимание списка, показанное в вашем вопросе, даст вам список (очевидно) ссылок на объекты CatOwner.

Вы действительно путаете вещи, присваивая понимание переменной, используемой в понимании.

Возможно, это поможет, так как не совсем ясно, какова ваша конечная цель:

 import pandas as pd  class CatOwner():  def __init__(self, name, df):  self.name = name  self.spent_on_cats = df.loc[df.registered_to == name]['sale_price'].sum()  df = pd.DataFrame([['helen', 'peanut', 3],  ['helen', 'butter', 7],  ['agnes', 'tuna', 5]],  columns=['registered_to', 'cat_name', 'sale_price'])  for catowner in [CatOwner(name, df) for name in df.registered_to.unique()]:  print(f'{catowner.name} spent {catowner.spent_on_cats} on cats')  

Обратите внимание, как ссылка на ваш фрейм данных передается в качестве аргумента конструктору класса. Хотя df доступен в рамках вашего исходного кода, по мере реструктуризации вашей программы вы можете легко обнаружить, что она внезапно выходит за рамки, и ваша программа сломается. Лучше сделать это таким образом, ИМО

Комментарии:

1. Конечная цель… По правде говоря, я пытаюсь перенести 25-летнюю книгу Excel моей организации в следующее поколение. Один и тот же человек был там все это время. Они готовы учиться, но на них оказывается давление, чтобы подключить значительную сеть различных книг Excel с некоторой помощью SQL. Объекты, которые я пытаюсь создать здесь, находятся в центре всего этого. Они легко могут иметь несколько сотен атрибутов и методов/функций.