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

Python 是否使用方法返回值或将方法结果赋给属性?,python,oop,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") sel

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

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调用的其他函数

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

通常,一个服务类计算值,另一个值类(POD)保存结果


因此,这取决于上下文,而您的类名
test
对它没有帮助:)

这有点像是暗箭伤人,但我想这可能就是您想要的

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
当然,你可以做比更新变量更复杂的事情


看一下:

我不确定我是否理解这个问题。您是否想知道在创建实例时是应该在类中计算属性,还是仅仅公开进行计算的方法?我认为答案将取决于需要该值的频率(以及计算成本)。中间路线可能是在第一次请求时计算值,然后将其缓存以在后续请求中使用。我正在尝试确定返回计算值的约定是否应为test.A(),或者是否应将计算值分配给通过test.A调用的属性。如果将计算值分配给属性是惯用的做法,那么pythonic的方法是什么呢?谢谢你的回答——你知道有什么资源可以帮助你理解“通常是一个服务类计算值,另一个值类(POD)保存结果。”@user2726995领域驱动设计是热门术语。你可以很容易地找到关于这个主题的大量信息。