我正在实现一个用户界面。许多对象将各种属性暴露给用户界面。它们每个都有一个对象“ExposedProperties”,其中包含暴露属性的列表(及其类型,应如何显示它们,如何验证输入等)。此ExposedProperties对象为每个类计算一次。
我希望得到一个对象的所有暴露属性的串联。一种方法是让每个对象将其“ExposedProperties”传递给__init__
中的继承链,并为每个超类将其与自己的ExposedProperties连接起来。基类将在对象上设置连接的ExposedProperties 。
另一种方法是等待从对象请求总曝光属性。然后,在mro
exposed_properties
属性中扫描每个类的基类方法在那时将它们连接起来。
在Python中连接存储在继承链中的这些对象的最Pythonic方法是什么?
答案 0 :(得分:1)
由于公开的属性是类属性,因此在创建类时构造所需的列表(类的暴露属性及其祖先的属性)是有意义的,您可以使用元类。 (编辑:我在评论中看到了同样的建议。)
以下是这样做的一个例子:
class ExposedMeta(type):
def __init__(cls, name, bases, attrs):
if not "exposed_properties" in attrs:
cls.exposed_properties = []
all_props = set(cls.exposed_properties)
for base in bases:
all_props.update(getattr(base, "all_exposed_properties", []))
cls.all_exposed_properties = list(all_props)
super(ExposedMeta, cls).__init__(name, bases, attrs)
class A(object):
__metaclass__ = ExposedMeta
exposed_properties = ['A1', 'A2']
class B(A):
exposed_properties = ['B']
class C(A):
pass
class D(object):
__metaclass__ = ExposedMeta
exposed_properties = ['D']
class E(B, D):
exposed_properties = ['E1', 'E2']
for cls in [A, B, C, D, E]:
print "Class %s, exposed: %s, all exposed: %s" % (cls.__name__, cls.exposed_properties, cls.all_exposed_properties)