计算两个类对象的输出之间的差异

时间:2017-07-12 12:44:08

标签: python django

我创建了两个类对象,它们从数据库中检索信息并将它们存储在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()

我相信我需要为差异计算制作第三类,但我无法弄清楚如何传递前两个的回报。

1 个答案:

答案 0 :(得分:0)

我如何理解你的问题,它与django无关,而是将对象从一个类传递到另一个类。以下是class Cclass 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()