我编写了一个库,该库使用用户定义的类,以自定义公式方式计算某些已定义的属性。稍后,此用户定义的公式将用于某些库函数中。公式具有通用参数的允许范围。因此,用户必须定义最小和最大允许参数值。在使用之前,检查允许的参数范围很重要。
以下代码显示了目前的工作方式。
用户必须使用类参数min
和max
以及set_all_attributes()
方法编写子类。在这种方法中,他可以实现自定义代码,并且必须显式调用check_value_range()
方法。这个子类需要一些样板代码,用户必须为许多自定义子类中的每一个编写代码。特别是check_value_range()
方法的调用。
现在我的问题:是否有更好的方法来实施边界检查?是否有可能在元类的帮助下隐式调用检查?出于性能原因,只应对所有类属性执行一次检查。
from abc import ABCMeta, abstractmethod
class Base:
__metaclass__ = ABCMeta
def __init__(self, init_value=0):
self.a = init_value
self.b = init_value
self.c = init_value
def check_value_range(self, value):
"""make sure the value is in the permitted range"""
if value < self.min or value > self.max:
raise ValueError('value not in permitted range!')
@abstractmethod
def set_all_attributes(self, value):
"""force subclasses to override this method"""
pass
class UserDefinedSubclass(Base):
"""user has to define the min and max class arguments
as well as the set_all_attributes() method"""
min = 0
max = 10
def set_all_attributes(self, value):
"""the user has to explicitly call the
check_value_range() method"""
self.check_value_range(value)
self.a = 1+2*value
self.b = 2+5*value
self.c = 3+4*value
def some_library_function(user_class):
u = user_class()
u.set_all_attributes(2)
return u.a + u.b + u.c
# usage
print some_library_function(UserDefinedSubclass)