2012-04-28 46 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