Python 对于类中的多个属性,是否有更快的方法使用@property?
是否有比使用@property方法更短的方法向类添加属性并验证设置?下面的代码是一个示例。我希望能够验证类中的许多属性,这样做似乎是多余的。非常感谢您的建议Python 对于类中的多个属性,是否有更快的方法使用@property?,python,python-decorators,Python,Python Decorators,是否有比使用@property方法更短的方法向类添加属性并验证设置?下面的代码是一个示例。我希望能够验证类中的许多属性,这样做似乎是多余的。非常感谢您的建议 def valid_max(max_val=10): """ Decorator to check for valid value of a number between min and max """ def valid_value_decorator(func): def func_wrapper(wraps,value):
def valid_max(max_val=10):
"""
Decorator to check for valid value of a number between min and max
"""
def valid_value_decorator(func):
def func_wrapper(wraps,value):
if value <= max_val:
return func(wraps,value)
else:
raise(Exception('Value above max'))
return func_wrapper
return valid_value_decorator
class Test(object):
def __init__(self):
self._x=0
self._y=0
@property
def x(self):
return self._x
@x.setter
@valid_max(max_val=10)
def x(self,data):
self._x = data
@property
def y(self):
return self._y
@y.setter
@valid_max(max_val=10)
def y(self,data):
self._y = data
def valid_max(max_val=10):
"""
Decorator检查最小值和最大值之间的数字的有效值
"""
def有效值装饰器(func):
def func_包装(包装,值):
如果值,则可以编写一个函数来生成属性:
def CustomProp(name, maxval):
name = '_' + name
@property
def pro(self):
return getattr(self, name)
@pro.setter
def pro(self, val):
if not isinstance(val, (int, float)):
# In Python 2 -> '' > 10(or any number) is True, so better check the type as well.
raise TypeError('Only integers and floats are allowed.')
if val > maxval:
raise ValueError("Value {!r} above maximum {!r}.".format(val, maxval))
else:
setattr(self, name, val)
return pro
class Test(object):
x = CustomProp('x', 10)
y = CustomProp('y', 20)
z = CustomProp('z', 30)
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
演示:
>>> t = Test(1, 2, 3)
>>> t.x = 10
>>> t.y = 11
>>> t.x = 11
Traceback (most recent call last):
File "<pyshell#41>", line 1, in <module>
t.x = 11
File "/home/ashwini/py/so.py", line 14, in pro
raise ValueError("Value {!r} above maximum {!r}.".format(val, maxval))
ValueError: Value 11 above maximum 10.
>>> t.x = 'Python'
Traceback (most recent call last):
File "<pyshell#42>", line 1, in <module>
t.x = 'Python'
File "/home/ashwini/py/so.py", line 12, in pro
raise TypeError('Only integers and floats are allowed.')
TypeError: Only integers and floats are allowed.
>>> t.z = 31
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
t.z = 31
File "/home/ashwini/py/so.py", line 14, in pro
raise ValueError("Value {!r} above maximum {!r}.".format(val, maxval))
ValueError: Value 31 above maximum 30.
>>> t.x, t.y, t.z
(10, 11, 3)
t=Test(1,2,3)
>>>t.x=10
>>>t.y=11
>>>t.x=11
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
t、 x=11
文件“/home/ashwini/py/so.py”,第14行,在pro中
raise VALUERROR(“值{!r}高于最大值{!r}.”。格式(val,maxval))
ValueError:值11高于最大值10。
>>>t.x='Python'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
t、 x='Python'
文件“/home/ashwini/py/so.py”,第12行,在pro中
raise TypeError('只允许整数和浮点')
TypeError:只允许整数和浮点。
>>>t.z=31
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
t、 z=31
文件“/home/ashwini/py/so.py”,第14行,在pro中
raise VALUERROR(“值{!r}高于最大值{!r}.”。格式(val,maxval))
ValueError:值31高于最大值30。
>>>t.x,t.y,t.z
(10, 11, 3)
如果最小值和最大值
测试值
是否大于最大值
,那么如何测试最大值
?这个傻瓜如何回答这个问题@jornsharpe?这是为了避免在一堆基本上都是样板文件的属性中键入太多的装饰符。这是一个非常类似的解决方案,但不需要@property decorator