2014-11-15 53 views
0

我的問題很簡單:如何添加屬性和setter到classmethod?如何在classmethod上應用屬性?

這裏是我的代碼:

class Ingredient(): 
    __max_stock = 100 
    __stock = 0 
    __prix = 0 

    def __init__(self): 
     pass 

    @classmethod 
    @property 
    def prix(cls): 
     return cls.__prix 
    @classmethod 
    @prix.setter 
    def prix(cls, value): 
     assert isinstance(value, int) and int(abs(value)) == value 
     cls.__prix = value 


Ingredient.prix = 10  #should be OK 
Ingredient.prix = 'text' #should raise an error 
Ingredient.prix = 10.5  #should raise an error too 

問題是,當該變種是一個類變量的setter不起作用。 這裏是我的錯誤:

AttributeError: 'classmethod' object has no attribute 'setter' 

我使用Python 3.x的

+0

它是否必須是'classmethod'?爲什麼不只有一個默認值傳遞給構造函數,您可以在需要時進行更改? –

+1

我不確定'財產'和'classmethod'是否打算*一起工作 – chepner

+0

首先,最重要的是,感謝您對我的代碼進行了美化。 其次,我想保持classmethod的原因是價格是所有成分通用的。所以當我想改變價格時,所有的實例都會有一個更新的價格(以及stock和max_stock等) –

回答

1

不要直接以這種方式使用classmethod。如果您需要類似於實例屬性修飾器的類屬性修飾器(包括setter的可能性),請查看other questions以獲取一些良好的模式。 (你也可以用元類來做,但可能沒有理由進入它。)

-1

免責聲明:OP和我曾指出,這不工作(見註釋)。這是一個善意的嘗試來解決這個問題。我們只是在這裏留下後代。

class Ingredient(object): 
    __max_stock = 100 
    __stock = 0 
    __prix = 0 

    def __init__(self): 
     pass 

    @property 
    def prix(cls): 
     return cls.__prix 
    @prix.setter 
    def prix(cls, value): 
     if isinstance(value, int) and value >= 0: 
      cls.__prix = value 
     else: 
      # il faut que value soit...? 
      raise ValueError('`value` must be a positive integer') 


Ingredient.prix = 100 

i_1 = Ingredient() 
print(i_1.prix) 

Ingredient.prix = 40 
i_2 = Ingredient() 

print(i_1.prix, i_2.prix) 

它打印:

100 
40, 40 

所以它似乎工作,對不對?

+0

它不起作用。如果我做Ingredient.prix ='文本',它不會像我在setter –

+0

@EliasRhouzlane中定義的那樣引發錯誤,你是對的。不知道這裏還有什麼要做。 –

+0

無論如何感謝您的幫助,非常酷! –

相關問題