2012-04-28 45 views
1

我希望我的Python類在將屬性分配給屬性時自動檢查值的類型。用於靜態類型化類屬性的Python模塊

有enthought的traits模塊和IPython有一個純Python版本作爲其子模塊IPython.utils.traitlets。有沒有類似的模塊?如果該模塊具有自動命令行參數分析器來設置這些屬性,那會更好。

編輯:謝謝你的小片。但我想Python 。如果有圖書館這樣做,我不想自己重新實現。

+5

爲什麼要爲動態類型化語言使用靜態類型變量? – Blender 2012-04-28 00:35:15

+0

定義自動檢查。你總是可以昏迷的類型。 – CppLearner 2012-04-28 00:51:23

+0

如果你關心靜態類型,你使用的是錯誤的語言。 – 2012-04-28 00:51:58

回答

2

我不知道traits ...但如果你想檢查對象的類型時,它被分配,則可以覆蓋__setattr__檢查......

class MyClass(object): 
    def __setattr__(self, attr, val): 
     if attr == 'my_attr': 
      if not isinstance(val, str): 
       raise ValueError('my_attr must be a string!') 
      else: 
       object.__setattr__(self, attr, val) 
     else: 
      object.__setattr__(self, attr, val) 

a = MyClass() 
a.my_attr = "Hello World!" # This is OK 
a.my_attr = 1    # This is not: ValueError 

但我真的不會推薦這樣做,沒有一個真正的理由...

1

幾乎任何方式的「自動」行爲可以確定對象屬性使用python描述符。最簡單的描述符是property

class Foo(object): 
    @property 
    def bar(self): 
     try: 
      return self._bar 
     except AttributeError: 
      return "default value" 

    @bar.setter 
    def bar(self, value): 
     if isinstance(value, Baz): # for some other type "Baz" 
      self._bar = value 
     else: 
      raise ValueError("wrong type for attribute bar," 
          " expected %r, got %r" % (Baz, type(value)) 
+0

我剛剛遇到了這個,並認爲我自己「這是'財產'的理想場所」。我將把它添加到我的答案中,但事實證明你已經做到了。 +1 – mgilson 2012-04-28 17:52:50