2013-06-19 28 views
0

案例。我想修改,並添加以下行爲,下面的代碼(這是一個上下文處理器):Python/Django OOP修改以下代碼以顯示get/set和構造函數

檢查,如果用戶通過認證檢查最後一次的餘額被更新(cookie的可能),如果它是在更新後最後5分鐘什麼都不做,否則照常取得新的平衡。

def get_balance(request): 

    if request.user.is_authenticated(): 
     balance = Account.objects.get(user=request.user).balance 
    else: 
     balance = 0 

    return {'account_balance': balance} 

但是:

我想瞭解多一點關於在Django/Python的 OOP可一些修改例子來實現我的目標,包括使用:

屬性:我來自Java,我想集合得到,它對我來說更有意義。如果不存在,取得平衡,否則創建新的。

構造函數方法:在Python中,我認爲我必須將其更改爲類並使用init權限?

UPDATE:

要使用結構我第一次覺得我需要創建一個類,我假設這個使用在Django的上下文處理器做這樣的事情是確定的:

class BalanceProcessor(request): 

    _balance = Account.objects.get(user=request.user).balance 

    @property 
    def get_balance(self): 
     return return {'account_balance': _balance} 

    @setter??? 
+1

請修復您的縮進。對Python代碼來說這不是一個可選的東西。 – jsbueno

+0

@jsbueno鍵入問題,所以忘記了indention,修復:) – GrantU

+0

我一直試圖正確回答你的問題,但你繼續編輯它;)順便說一句,「請求」變量旁邊的「平衡處理器」括號是你會是子類化......這不是一個爭論。 – JoeLinux

回答

2

Python是而不是Java。在Python中,你不會無緣無故地創建類。當您想要使用代碼封裝數據時,類就是用於這些類的。在這種情況下,不存在這樣的事情:您只需獲取一些數據並將其返回。無論如何,課堂都沒有任何好處。

在任何情況下,即使你創建一個類,再次Python是不是Java,除非你確實需要做一些處理,當你獲取和設置你不創建的屬性getter和setter方法。如果你只是想訪問一個實例屬性,那麼你只需訪問它。

最後,你提出的代碼不會有兩個原因。首先,您試圖從request繼承。這沒有意義:除非你繼承了某些東西,否則你應該從object繼承。其次,你如何期待你的類被實例化?上下文處理器通常是函數,這意味着Django期望可調用。如果你把這個類作爲上下文處理器,那麼調用它就會實例化它:但是沒有什麼會調用get_balance方法。而且你的代碼會失敗,因爲Django將通過request進入臨時階段(因爲它期待着使用函數),而你的__init__並不期望這個參數。

在Python中嘗試類是很好的,但上下文處理器並不適合它。

+0

嗨@丹尼爾羅斯曼,我仍然看到這裏需要一個getter和setter。它可以讓我獲得平衡,並讓代碼設置一個,如果沒有創建。我還看到將來需要更改或修改設定的平衡方法。一個二傳手在這裏對我更有意義。它未來證明了代碼!如果不這樣做,我不會看到如何在不更改調用方法的情況下更改代碼。 – GrantU

+0

我們對getter和setter不是「面向未來的」:這就是爲什麼Python擁有'@ property'裝飾器的原因。但是,在這裏設置什麼會有什麼意義?上下文處理器將在模板呈現時實例化,然後立即處理。什麼都沒有堅持。你爲什麼要設置數據? –

+0

我感謝您花時間解釋,這是我需要學習的東西。就上下文處理器而言,我現在看到爲什麼這是沒有意義的。 @property非常有趣我試圖編輯代碼以利用它們(假裝它不是上下文處理器) – GrantU