使用方法返回值或将方法结果赋值给属性?

时间:2014-02-28 22:42:01

标签: python oop

我目前正在重构一些使用全局变量的代码:

import pandas as pd
from datetime import date, timedelta

class test(object): 
    def __init__(self): 
        self.fiscal_cal = pd.read_csv(r'c:\CENSORED')
        self.today = date.today().strftime("%Y-%m-%d") 
        self.yesterday = (date.today() - timedelta(1)).strftime("%Y-%m-%d") 

    def _calc_period_start(self,input_date,period): 
        month, year, season = map(lambda x: self.fiscal_cal[x][self.fiscal_cal['date']==input_date], ['fmth','fyr','fiscal_season'])
        if period == 'month': 
            return self.fiscal_cal['date'][(self.fiscal_cal['fmth'] == int(month)) & (self.fiscal_cal['fyr'] == int(year))].irow(0)
        return self.fiscal_cal['date'][self.fiscal_cal['fiscal_season'] == season.values[0]].irow(0)

    def _calc_match_date(self,input_date,years_back=1): 
        fwk, fyr, fdt = map(lambda x: self.fiscal_cal[x][self.fiscal_cal['date']==input_date], ['fwk','fyr','fdt'])
        _ = self.fiscal_cal['date'][(self.fiscal_cal['fdt'] == int(fdt)) & (self.fiscal_cal['fyr'] == int(fyr - years_back))]
        return _.item()

    def month_start_ty(self): 
        return self._calc_period_start(self.today,period='month') 

    def season_start_ty(self): 
        return self._calc_period_start(self.today,period = 'season')

    def match_ly(self): 
        _ = self._calc_match_date(self.today,1) 
        return _

    def month_start_ly(self):
        _ = self._calc_match_date(self.today,1)
        return self._calc_period_start(_,period = "month")

    def season_start_ly(self): 
        _ = self._calc_match_date(self.today,1)
        return self._calc_period_start(_,period = 'season') 

我很困惑我应该在哪里使用方法将信息返回给我的程序 - 或者将方法的输出分配给属性,然后访问/使用

中的属性
import pandas as pd
from datetime import date, timedelta

class test(object): 
    def __init__(self): 
        self.fiscal_cal = pd.read_csv(r'c:\CENSORED')
        self.today = date.today().strftime("%Y-%m-%d") 
        self.yesterday = (date.today() - timedelta(1)).strftime("%Y-%m-%d") 
        self.month_start_ty = self._calc_period_start(self.today,period='month')
    def _calc_period_start(self,input_date,period): 
        month, year, season = map(lambda x: self.fiscal_cal[x][self.fiscal_cal['date']==input_date], ['fmth','fyr','fiscal_season'])
        if period == 'month': 
            return self.fiscal_cal['date'][(self.fiscal_cal['fmth'] == int(month)) & (self.fiscal_cal['fyr'] == int(year))].irow(0)
        return self.fiscal_cal['date'][self.fiscal_cal['fiscal_season'] == season.values[0]].irow(0)

    def _calc_match_date(self,input_date,years_back=1): 
        fwk, fyr, fdt = map(lambda x: self.fiscal_cal[x][self.fiscal_cal['date']==input_date], ['fwk','fyr','fdt'])
        _ = self.fiscal_cal['date'][(self.fiscal_cal['fdt'] == int(fdt)) & (self.fiscal_cal['fyr'] == int(fyr - years_back))]
        return _.item()

这些日期作为参数传递给进行API调用的其他函数。

2 个答案:

答案 0 :(得分:0)

如果计算值在概念上是您为其计算的对象的属性,并且您希望此对象保存状态,则可以将其存储为属性。如果该类是服务,那么它应该只返回它。

通常以一个服务类计算值的方式完成,另一个 - 类( POD 保持结果。

所以这取决于上下文,而您的班级名称test对它没有帮助:)

答案 1 :(得分:0)

嗯,这在黑暗中有点刺痛,但我想这可能就是你在寻找的东西!

class C:
    def __init__(self):
        self._x

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = x

如果您编写这样的代码,您可以执行此类操作

c = C()
print c.x
c.x = 3

但是当然你可以做更复杂的事情,而不仅仅是更新变量!

查看docs