#python #class #methods #attributes #parameter-passing
#python #класс #методы #атрибуты #передача параметров
Вопрос:
Я создал объект класса следующим образом:
class Dummy:
def __init(self, **kwargs):
self.__dict__ = kwargs
Я создаю экземпляр класса следующим образом:
dummy_df = pd.DataFrame([['Valid','NY',12],['Invalid','DD',6],['Valid','CA',18],['Valid','Total',30],['Invalid','Total',6]], columns = ['Type','Value','Count'])
dummy_dict = {'dummy_attribute':dummy_df}
dummy_instance = Dummy(**dummy_dict)
dummy_instance.dummy_attribute
Type Value Count
0 Valid NY 12
1 Invalid DD 6
2 Valid CA 18
3 Valid Total 30
4 Invalid Total 6
Теперь я хочу создать метод для фиктивного класса, которому можно было бы передать имя атрибута в качестве аргумента и из которого можно было бы получить фрейм данных, содержащий только итоговые значения из фрейма данных, связанного с этим атрибутом.
Например, ввод будет выглядеть примерно так:
dummy_instance.get_totals('dummy_attribute')
И результат будет выглядеть следующим образом:
Type Value Count
3 Valid Total 30
4 Invalid Total 6
Ответ №1:
Вы можете использовать hasattr, getattr, setattr
для запроса, получения и установки атрибутов класса:
import pandas as pd
class Dummy:
def __init__(self, **kwargs):
for k, v in kwargs.items():
# Checks each key as class attribute
if not hasattr(self, k):
# Sets key
setattr(self, k, v)
else:
# Key already used!
print("Error attribute name: %s already used!" % k)
def get_totals(self, name):
if not hasattr(self, name):
print("Error: attribute not found!")
return
# gets the attribute from the class, like self.<name>
df = getattr(self, name, None)
# Filter dataframe
return df.loc[df['Value']=='Total']
columns = ['Type','Value','Count']
dummy_df1 = pd.DataFrame([['Valid','NY',12],['Invalid','DD',6],['Valid','Total',12],['Invalid','Total',6]], columns=columns)
dummy_df2 = pd.DataFrame([['Valid','NY',22],['Invalid','DD',7],['Valid','Total',22],['Invalid','Total',7]], columns=columns)
dummy_dict = {'dummy_attribute_1': dummy_df1, 'dummy_attribute_2': dummy_df2}
dummy_instance = Dummy(**dummy_dict)
result = dummy_instance.get_totals('dummy_attribute_1')
print(result)
Вывод:
Type Value Count
2 Valid Total 12
3 Invalid Total 6