擅长:python、mysql、java
<p>有各种不同程度的解决方案。我总是喜欢用类装饰器。在</p>
<pre><code>class IntField(object):
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('expecting integer')
instance.__dict__[self.name] = value
def with_intfields(*names):
def with_concrete_intfields(cls):
for name in names:
field = IntField()
field.name = name
setattr(cls, name, field)
return cls
return with_concrete_intfields
</code></pre>
<p>你可以这样使用它:</p>
^{pr2}$
<p>演示:</p>
<pre><code>$ python2.7 -i clsdec.py
>>> [x for x in vars(Example) if not x.startswith('_')]
['a', 'b']
>>> Example.a.name
'a'
>>> e.a = 3
>>> e.b = 'test'
[...]
ValueError: expecting integer
</code></pre>
<p>请确保在Python2.7中显式地从<code>object</code>子类,这让我在起草这个答案的第一个版本时遇到了麻烦。在</p>