2010-11-10 56 views
0

我有一個Python類如下Python類屬性不評估,如果條件

class Application(models.Model): 
    name = models.CharField(help_text="Application's name",max_length=200) 
    current_status = models.IntegerField(null=True, blank=True) 
    class Meta: 
     ordering = ["name"] 

    @property 
    def status(self): 
     """Returns the current ApplicationStatus object of this Application.""" 
     try: 
      return ApplicationStatus.objects.get(id = self.current_status) 
     except ApplicationStatus.DoesNotExist as e: 
      print e 
      return None 

在另一大類我檢查的財產狀況,如下面的語句

app = Application() 
    if app.status is None: 
     #do some thing 
    else: 
     print app.status 

雖然我確保應用程序的狀態不是無,其他打印語句打印無,當我嘗試訪問狀態像app.status.id時,應用程序會引發異常NoneType has no property id

當我改變了條件:

app = Application() 
    st = app.status 
    if st is None: 
     #do some thing 
    else: 
     #do another thing 

它工作正常。

有人可以告訴我爲什麼python屬性不在print語句中評估嗎?

回答

0

你說:

雖然我確保應用程序的狀態不是無,else子句被執行

您發佈的代碼是:

if app.status is None: 
     #do some thing 
else: 
     #do another thing 

如果status不是None那麼將執行else子句。

我不明白第二種情況是如何工作的,因爲else子句也應該在這裏執行。

+0

對不起Dave,編輯帖子以反映實際問題 – Fanooos 2010-11-10 10:21:19

0

你說app.status傳遞的第一個,如果條件(所以它不是無),但是當你打印,其打印無...

是十分明顯的,第一次app.status返回的東西從不同沒有,第二次有所改變,app.status(每次評估)返回無

事實上,如果你將app.status返回的值存儲在另一個var中(所以它沒有修改)它工作正常。

+0

如果print語句是else子句中的第一個語句,那麼會更改app.status值?我也沒有使用線程 – Fanooos 2010-11-10 10:32:50

+0

我不知道爲什麼app.status返回的值應該在兩個調用之間改變,但實際上它會改變...檢查完整的代碼以找出值的變化原因,但即使您修正它,我建議將值存儲在另一個var中,就像你一樣,用st = app.status ...如果你認爲,在2個不同的時刻調用相同的屬性是很奇怪的。你不能確定他們將是平等的... – Ant 2010-11-10 13:42:58

0

我認爲原因是你正在執行2次相同的代碼,但有不同的上下文:

你可以做個試驗:

print app.status 
print app.status 

第一印刷應該是不無,但第二個是: 你要看看是什麼改變成兩個呼叫之間的應用程序對象(你有沒有信號,等...) 嘗試在status函數中打印self.current_status。

+0

我沒有信號或線程 – Fanooos 2010-11-10 11:36:40

0

也許問題出在ApplicationStatus類上。

實際上,您在非工作示例中所做的是調用「ApplicationStatus.objects.get(id = self.current_status)」兩次。可能在第一次,它返回一個有效值,並且改變它的狀態,所以在第二次調用時,它返回None(或拋出一個ApplicationStatus.DoesNotExist)。

所以,我的建議:看看ApplicationStatus代碼。