我创建了两个类对象,它们从数据库中检索信息并将它们存储在pandas中,以便我使用数据科学库。它们都返回我在Django模板中显示的值。我想创建第三个值,它只是前两个的计算差值,并且还在Django模板中显示。
第一类对象:
class IntDailyNumbers (object):
def __init__(self, begin_date, end_date, store=None):
self.begin_date = begin_date
self.end_date = end_date
self.store = store
self.int_daily_numbers = pd.DataFrame(list(gapayment.objects.values('Trans_Store', 'Fee_Pd', 'Trans_date')))
self.int_daily_numbers['Fee_Pd'] = pd.to_numeric(self.int_daily_numbers['Fee_Pd'])
self.int_daily_numbers['Trans_date'] = pd.to_datetime(self.int_daily_numbers['Trans_date'])
self.sum_int_daily_numbers = np.sum(self.int_daily_numbers[(self.int_daily_numbers['Trans_date'] >=self.begin_date) &
(self.int_daily_numbers['Trans_date'] <= self.end_date) &
(self.int_daily_numbers['Trans_Store'] == self.store.store_number)])
def get_sum_int_daily_numbers(self):
sum_intdailynumbers = self.sum_int_daily_numbers['Fee_Pd']
sum_intdailynumbers = round(sum_intdailynumbers.astype(float), 3)
return sum_intdailynumbers
def __str__(self):
return self.get_sum_int_daily_numbers()
第二类对象:
class IntDailyGoals (object):
def __init__(self, begin_date, end_date, store=None):
self.begin_date = begin_date
self.end_date = end_date
self.store = store
#print(self.begin_date, self.end_date, self.store.store_number)
self.int_mnth_goal = pd.DataFrame(list(StoreGoalsInput.objects.values('store_number',
'interest',
'date')))
self.int_mnth_goal['interest'] = pd.to_numeric(self.int_mnth_goal['interest'])
self.int_mnth_goal['date'] = pd.to_datetime(self.int_mnth_goal['date'])
self.mnth_goal_int =self.int_mnth_goal[(self.int_mnth_goal['date'] >= self.begin_date) &
(self.int_mnth_goal['date'] <= self.end_date) &
(self.int_mnth_goal['store_number'] == self.store.store_number)]
self.mnth_goal_int= self.mnth_goal_int['interest']
self.tot_workingdays = np.busday_count(np.datetime64(self.begin_date),
np.datetime64(self.end_date),
weekmask='Mon Tue Wed Thu Fri Sat')
self.div_intmnthgoal_workingdays = round(np.divide(self.mnth_goal_int, self.tot_workingdays),2)
def get_div_goalsint_wdays(self):
div_goalsint_wdays = self.div_intmnthgoal_workingdays.tolist()[0]
return div_goalsint_wdays
def __str__(self):
return self.get_div_goalsint_wdays()
我相信我需要为差异计算制作第三类,但我无法弄清楚如何传递前两个的回报。
答案 0 :(得分:0)
我如何理解你的问题,它与django无关,而是将对象从一个类传递到另一个类。以下是class C
和class D
给出的两个简单解决方案。
首先让我们定义两个类的最小示例。两者都有一个方法,可以做某事并返回一些东西。
class A:
def foo(self):
print('foo')
return 'foo'
class B:
def bar(self):
print('bar')
return 'bar'
解决方案1:我们创建了第三个类,它具有类型A的实例和类型B的实例作为成员变量。
# Contains a class instance of A and B and baz() accesses their methods.
class C:
def __init__(self, a, b):
self.a = a
self.b = b
def baz(self):
self.a.foo()
self.b.bar()
您可以将此课程用于:
# main
a = A()
b = B()
c = C(a,b)
c.baz()
解决方案2:我们只是将两个返回值传递给函数qux()
。如果你想要它,这个函数也可以是一个类的一部分。
class D:
def qux(self, res_a, res_b):
print(res_a, res_b)
我们可以通过以下方式使用qux()
# main
a = A()
b = B()
d = D()
d.qux(a.foo(),b.bar())
由于对继承存在一些困惑。您也可以继承这些方法。不要将此与解决方案1混淆。我并不建议在这里使用继承。继承的想法是,子类对象is-a
父类对象,就像一个正方形是一个矩形。这不是你想要的。
class E(A,B):
def foobar(self):
self.foo()
self.bar()
来自main的用法:
e = E()
e.foobar()