用于静态类型类属性的Python模块

用于静态类型类属性的Python模块,python,static-typing,Python,Static Typing,我希望我的Python类在将值分配给属性时自动检查值的类型 有一个Enthound的模块,IPython有一个纯python版本作为它的子模块。有类似的模块吗?若那个模块有自动命令行参数解析器来设置这些属性,那个就更好了 编辑:感谢您的片段。但是我想要Python库。如果有库可以做到这一点,我不想自己重新实现。我不知道特性。。。但是,如果要在指定对象时检查对象的类型,可以覆盖\uuuu setattr\uuuu以检查 class MyClass(object): def __setattr

我希望我的Python类在将值分配给属性时自动检查值的类型

有一个Enthound的模块,IPython有一个纯python版本作为它的子模块。有类似的模块吗?若那个模块有自动命令行参数解析器来设置这些属性,那个就更好了


编辑:感谢您的片段。但是我想要Python库。如果有库可以做到这一点,我不想自己重新实现。

我不知道
特性。。。但是,如果要在指定对象时检查对象的类型,可以覆盖
\uuuu setattr\uuuu
以检查

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
但是如果没有很好的理由,我真的不建议这样做…

几乎任何形式的“自动”行为都可以使用python描述符在对象属性上确定。最简单的描述符是
属性

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))

为什么要为动态类型语言使用静态类型变量?定义自动检查。你可以随时使用该类型。如果你关心静态类型,那你使用的是错误的语言。我只是再次遇到了这个问题,并对自己说,“这是
属性
的最佳位置。”。我本来想把它加到我的答案里,但结果证明你已经做到了+1.