2013-10-31 104 views
2

我寫了下面的代碼:蟒蛇定義狀態對象

class Game(object): 
    class States(object): 
     STARTED = 1 << 0 
     LOADING = 1 << 1 
     ACTIVE = 1 << 2 
     ENDED = 1 << 3 

    state = States.LOADING 

它有沒有更好的方式來定義一個狀態對象?

+2

你爲什麼使用位?這些州不是相互排斥的嗎? –

+0

我所需要的就是能夠比較像'如果狀態和States.LOADING' – Nirock

+0

我猜這是有效的,但它似乎並不是最好的做法.. – Nirock

回答

7

我已經看到了這種模式:

class Demo: 
    STARTED, LOADING, ACTIVE, ENDED = range(4) 

,或者如果你真的需要不同的位:

class Demo: 
    STARTED, LOADING, ACTIVE, ENDED = (2**x for x in range(4)) 

這就是說,你爲什麼要負擔自己與做位操作?只需使用布爾屬性:

class States(object): 
    def __init__(self): 
     self.started = False 
     self.loading = False 
     self.active = False 
     self.ended = False 

,它允許你寫:

if state.loading: 

if state.started or state.loading: 

這是更具可讀性。

+0

在這種情況下,它只能是1個狀態 – Nirock

+2

,您應該避免位集,因爲它們的意思是「可以同時是它們中的任意數量」。 –

0

是的,有。使用新的Python Enum type(它也是backported)。那麼你的代碼是:

class State(Enum): 
    STARTED = 1 
    LOADING = 2 
    ACTIVE = 3 
    ENDED = 4 

class Game(object): 
    state = State.LOADING