我有一堆类在 ZODB 中持续存在。所有类都必须共享一些索引特性,而且它们都定义了很多属性。这些属性是在类级别上使用描述符定义的,以便能够拦截对它们的写入以进行验证并检查数据库中的重复项。为此,每个类都有一个自动维护的属性列表,_properties
. 他们还拥有_indices
和其他一些功能,我不想自己复制到每个元素类(大约 10 个左右)。
考虑以下代码:
class BaseElement(object):
_properties = None
class ElementFlavour1(BaseElement):
_properties = 'a', 'b', 'c'
....
class ElementFlavourN(BaseElement):
_properties = 'e', 'f', 'g'
for item in locals():
if issubclass(item, BaseElement):
item._v_properties_set = set(item._properties) if item._properties else set()
所以,它基本上做了它应该做的事情:我需要_properties
线性迭代,但我也想做快速查找,如果某个属性存在于类中。尽管如此,我不想重复自己并为每一种风格BaseElement
明确地指定这个集合。
当前的解决方案有效,但我认为它是一个丑陋的黑客,并希望摆脱它。例如BaseElement
,其他模块中的子类不会正确设置它们的属性。玩弄__new__
似乎也是错误的方式,因为它不会拦截类构造,而是实例化。那么,如何正确地做到这一点呢?
PS我知道OrderedDict,但这不是我要找的。我想以一种干净的方式挂钩到类创建过程并在那里附加任意功能。