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领域驱动设计是热门术语。你可以很容易地找到关于这个主题的大量信息。