我希望我的Python类在将属性分配给属性时自动检查值的类型。用于静态类型化类属性的Python模块
有enthought的traits模块和IPython有一个纯Python版本作为其子模块IPython.utils.traitlets。有没有类似的模块?如果该模块具有自动命令行参数分析器来设置这些属性,那会更好。
编辑:谢谢你的小片。但我想Python 库。如果有图书馆这样做,我不想自己重新实现。
我希望我的Python类在将属性分配给属性时自动检查值的类型。用于静态类型化类属性的Python模块
有enthought的traits模块和IPython有一个纯Python版本作为其子模块IPython.utils.traitlets。有没有类似的模块?如果该模块具有自动命令行参数分析器来设置这些属性,那会更好。
编辑:谢谢你的小片。但我想Python 库。如果有图书馆这样做,我不想自己重新实现。
我不知道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
但我真的不会推荐这样做,没有一个真正的理由...
几乎任何方式的“自动”行为可以确定对象属性使用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))
我刚刚遇到了这个,并认为我自己“这是'财产'的理想场所”。我将把它添加到我的答案中,但事实证明你已经做到了。 +1 – mgilson 2012-04-28 17:52:50
为什么要为动态类型化语言使用静态类型变量? – Blender 2012-04-28 00:35:15
定义自动检查。你总是可以昏迷的类型。 – CppLearner 2012-04-28 00:51:23
如果你关心静态类型,你使用的是错误的语言。 – 2012-04-28 00:51:58