在Python中,如何连接存储在继承链中的对象?

2024-09-29 17:16:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个用户界面。许多对象向用户界面公开各种属性。它们每个都有一个对象“ExposedProperties”,其中包含一个公开属性的列表(以及它们的类型、应该如何显示、应该如何验证输入等)。这个ExposedProperties对象为每个类计算一次。你知道吗

我想得到一个对象的所有公开属性的串联。一种方法是让每个对象将其“ExposedProperties”传递到__init__中的继承链上,并让每个超类将其与自己的ExposedProperties连接起来。基类将在对象上设置串联的ExposedProperties。你知道吗

另一种方法是等待从对象请求全部公开的属性。然后,一个基类方法扫描mro中每个类的exposed_properties属性,然后将它们连接起来。你知道吗

在Python中,连接这些存储在继承链中的对象的最Python的方法是什么?你知道吗


Tags: 对象方法类型列表属性initproperties用户界面
1条回答
网友
1楼 · 发布于 2024-09-29 17:16:47

由于公开的属性是类属性,因此在创建类时构造所需的列表(类的公开属性及其祖先属性的列表)是有意义的,可以使用元类。(编辑:我看到评论中也提出了同样的建议。)

下面是一个这样做的例子:

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)

相关问题 更多 >

    热门问题