如何避免在课堂上使用self .__ dict__

时间:2016-10-10 23:15:06

标签: python class dictionary

有人告诉我,我应该避免在我的代码中使用self.__dict__,但我无法找到另一种解决方法。我刚刚开始上课,所以不太清楚如何做到这一点。

class variable( object ):
    def __init__( self, json_fn, *args, **kwargs ):

        self.metrics = self.getmetrics(json_fn)
        for metric in self.metrics :
            self.__dict__[metric] = self.get_metric_dataframes(metric)

    def get_metric_dataframes( self , metric_name ):
        '''extract and return the dataframe for a metric'''

因此,我的对象“变量”具有存储在json中的不同度量的不同数据帧。我希望能够执行variable.temperature,variable.pressure,variable.whatever而无需编写:

self.temperature = self.get_metric_dataframes(temperature)
self.pressure = self.get_metric_dataframes(pressure)
self.whatever = self.get_metric_dataframes(whatever)

由于所有数据帧都使用相同的函数提取,并将度量作为参数。这就是我循环使用指标并使用

的原因

self.__dict__[metric] = self.get_metric_dataframes(metric)

所以知道我永远不会更新任何这些数据帧(我在代码中使用它们的副本但不想更新对象的值)。

还有其他解决方案吗?

我可以做的另一种方法是构建一个字典,其中所有指标都作为关键字和数据框作为值并存储在self.metric中,然后我可以用object.metric['temperature']调用它但我宁愿立刻做object.temperature,我很想知道是否可以做到。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

如果每个UITypeEditor都是字符串,则可以使用setattr代替对实例字典的直接访问:

metric

答案 1 :(得分:1)

有几种解决方案:

  • 使用__getattr__,但您可能遇到困难(实施可能非常重要)
  • 使用属性:优雅和经典的解决方案,
  • 使用描述符:如果您熟悉这一点,可能很难调试。

最后,您使用__dict__的解决方案非常好。您也可以使用getattr / setattr

另一种解决方案是将您的指标存储在您自己的词典中:

self.metric_dict = {metric: self.get_metric_dataframes(metric) for metric in metrics}

然后定义属性以访问此字典,如属性

@property
def temperature(self):
    return self.metric_dict["temperature"]

等等......