【发布时间】:2017-01-25 03:26:37
【问题描述】:
我有几个类,每个类都有许多属性。所有属性的共同点是它们应该是数字属性。这似乎是使用 python 装饰器的理想场所,但我似乎无法理解正确的实现是什么。这是一个简单的例子:
class Junk(object):
def __init__(self, var):
self._var = var
@property
def var(self):
"""A numeric variable"""
return self._var
@var.setter
def size(self, value):
# need to make sure var is an integer
if not isinstance(value, int):
raise ValueError("var must be an integer, var = {}".format(value))
self._var = value
@var.deleter
def size(self):
raise RuntimeError("You can't delete var")
在我看来应该可以编写一个装饰器来完成所有操作,以便将上述内容转换为:
def numeric_property(*args, **kwargs):
...
class Junk(object):
def __init__(self, var):
self._var = var
@numeric_property
def var(self):
"""A numeric variable"""
return self._var
这样新的numeric_property 装饰器可以在许多类中使用。
【问题讨论】:
-
numeric_property会做什么property还没有做?如果返回的值不是数字,则引发异常?严格类型真的不是 Python 风格。 IMO 在 Python 中强制执行它会使您的代码变得不灵活,例如Java,但仍然和 Python 一样慢。 -
你当然可以这样做,阅读docs.python.org/3/howto/descriptor.html
-
你为什么想让
numeric_property成为一个装饰者呢?为什么不只是一个返回属性的函数,所以你只需在你的类定义中做var = numeric_property('_var')? (如果你愿意,你可以让它接受文档字符串作为另一个参数。)
标签: python python-3.x decorator python-decorators