【发布时间】:2019-12-24 21:46:18
【问题描述】:
我有一个类,它的字段都是属性,通过 getter 和 setter 以某种方式验证,这样它就会满足以下模式:
import numpy as np
import typing
def validate_field(value, dtype: typing.Type):
limits = np.iinfo(dtype)
assert limits.min < value < limits.max, \
"value shoule be in range: {} < {} < {}".format(limits.min, value,
limits.max)
return value
class Foo:
def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c
@property
def a(self):
return self._a
@property
def b(self):
return self._b
@property
def c(self):
return self._c
@a.setter
def a(self, value):
self._a = validate_field(value, self._a.dtype)
@b.setter
def b(self, value):
self._b = validate_field(value, self._b.dtype)
@c.setter
def c(self, value):
self._c = validate_field(value, self._c.dtype)
我想避免为每个方法键入单独的属性和设置器装饰器。
我想过通过手动使用属性
self._a = a
def set_a(self, value):
self._a = validate_field(value, self._a.dtype)
self.a = property(lambda self: self._a, set_a)
...
但是,我似乎仍然需要手动定义一个函数来访问 setter 和 getter 所需的成员,所以我并没有真正节省太多工作。
如果有办法通过命名参数来自动生成这样的函数,例如:
def generate_function(self, parameter)
def temp(self, value):
self.parameter = validate_field(value, self.parameter.dtype)
return temp
那么我不会有任何问题,但现在我不知道如何实现这一点。
有没有办法让我在__init__ 中使用每个字段的单个装饰器或基于自动函数的属性生成来生成这些函数?
【问题讨论】:
标签: python python-3.x properties python-decorators