Создание атрибутов атрибутов - возможно? - PullRequest
0 голосов
/ 22 марта 2019

Я имею дело с месячными данными для ряда различных наборов данных (например, температуры воздуха, температуры океана, скорости ветра и т. Д.), В результате чего каждый месяц и каждый набор данных будут иметь одинаковые атрибуты. Я хочу иметь возможность инициализировать и заполнять эти атрибуты максимально эффективно. До сих пор я могу думать только о попытке как-то добавить новые атрибуты к уже существующим атрибутам. Возможно ли это в Python?

Например, допустим, я инициализирую все свои месячные переменные, как показано ниже:

class Data_Read:
    def __init__(self, monthly=np.zeros((200,200,40))): #3D data
        self.jan = monthly 
        self.feb = monthly
        self.march = monthly
        self.april = monthly
        self.may = monthly
        self.june = monthly
        self.july = monthly
        self.august = monthly
        self.sept = monthly
        self.oct = monthly
        self.nov = monthly
        self.dec = monthly

Затем я могу создать новый набор данных для каждого месяца, который станет чем-то вроде air_temp.jan или wind_speed.june, выполнив следующие действия:

air_temp = Data_Read()
wind_speed = Data_Read()

Это будут атрибуты необработанных данных. Однако затем я хотел бы выполнить некоторую обработку для каждого из этих наборов данных (например, удаление трендов). Есть ли способ, которым я могу создать класс (или новый класс?), Который будет генерировать новые атрибуты, такие как self.jan.detrend. По сути, я хочу избежать написания 12 строк кода для каждого атрибута, который я хочу создать, и затем иметь возможность легко вызывать любой «атрибут атрибута» в моих функциях обработки данных.

Большое спасибо.

1 Ответ

0 голосов
/ 22 марта 2019

Вот пример того, как вы можете хранить все внутри словаря и по-прежнему ссылаться на массивы как на атрибуты, а также вызывать функции для массивов по имени:

import numpy as np


class Data_Read:
    def __init__(self, monthly_shape=(200, 200, 40)): #3D data
        months = [
            "jan",
            "feb",
            "march",
            "april",
            "may",
            "june",
            "july",
            "august",
            "sept",
            "oct",
            "nov",
            "dec"
        ]
        self._months = {month: np.zeros(monthly_shape) for month in months}

    def detrend(self, month):
        # this is a dummy function that just increments
        return self._months[month] + 1

    def __getattr__(self, name):
        if name in self._months:
            return self._months[name]
        return super().__getattr__(name)

air_temp = Data_Read()
print(air_temp.jan.shape)  # (200, 200, 40)
print((air_temp.detrend("jan") == 1).all())  # True

Вы также можете достичь того же результата, используя setattr и getattr, потому что атрибуты просто сохраняются в словаре объекта в любом случае:

import numpy as np


class Data_Read:
    def __init__(self, monthly_shape=(200, 200, 40)): #3D data
        months = [
            "jan",
            "feb",
            "march",
            "april",
            "may",
            "june",
            "july",
            "august",
            "sept",
            "oct",
            "nov",
            "dec"
        ]
        for month in months:
            setattr(self, month, np.zeros(monthly_shape))

    def detrend(self, month):
        # this is a dummy function that just increments
        return getattr(self, month) + 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...