我有一个基类,我可以从中派生出多个子类
每个子类定义类常量,我希望对它们强制执行某些限制。
例如:
class Base(object):
# define these in your sub-class, and make sure (NOM % DENOM == 0)
NOMINATOR = None
DENOMINATOR = None
class Subclass_good(Base):
NOMINATOR = 6
DENOMINATOR = 3
class Subclass_bad(Base):
NOMINATOR = 7
DENOMINATOR = 5
我希望能够执行规则(NOM%DENOM == 0) 我目前使用类装饰器执行此操作:
def nom_denom_validator(cls):
assert(cls.NOMINATOR % cls.DENOMINATOR == 0)
return cls
# and decorate each subclass, e.g.:
@nom_denom_validator
class Subclass_another(Base):
NOMINATOR = 9
DENOMINATOR = 12
但我不喜欢我需要装饰每个子类的事实(我有很多)。我很感兴趣是否可以直接对Base类进行一些操作。
有什么建议吗?
答案 0 :(得分:8)
好的,好笑。我想了一段时间,但只是在发布问题后 - 特别是在选择标签时,并在那里添加“元类” - 我意识到自己可能会得到答案。
所以,提交审查和未来的知识,这里是:
class Base_Metaclass(type):
def __new__(meta, classname, bases, class_dict):
new_type = type.__new__(meta, classname, bases, class_dict)
if not (new_type.NOMINATOR % new_type.DENOMINATOR) == 0:
raise Exception("Invalid subclass created - validation failed")
return new_type
# have Base and all its descendants be enforced:
class Base(object):
__metaclass__ = Base_Metaclass
# I must pass the validation myself, no None's anymore...
NOMINATOR = 1
DENOMINATOR = 1
现在所有的孩子都应该自动执行。
答案 1 :(得分:1)
您可以在基类构造函数
中进行检查class Base(object):
# define these in your sub-class, and make sure (NOM % DENOM == 0)
NOMINATOR = None
DENOMINATOR = None
def __init__(self):
assert(self.NOMINATOR % self.DENOMINATOR == 0)
当您创建Subclass_bad()
的实例时,您将获得AssertionError
。