Укажите атрибут класса в качестве аргумента метода класса python class object

#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