如何从所有父类访问属性?

时间:2015-05-13 10:37:02

标签: python function overloading

class T(object):
    def f(self):
        pass

class T1(T):
    fields = set(('x1', 'y1', 'z1'))

class T2(T1):
    fields = set(('x2', 'y2'))

t=T2()

我希望调用t.f()返回set(('x1','y1','z1','x2','y2')),我不想在每个子类中重写'f',不知道吗?

1 个答案:

答案 0 :(得分:1)

这适用于您的示例:

class T(object):
    def f(self):
        fields = set()
        for cls in self.__class__.mro():
            if hasattr(cls, 'fields'):
                fields = fields.union(cls.fields)
        return fields

class T1(T):
    fields = set(('x1', 'y1', 'z1'))

class T2(T1):
    fields = set(('x2', 'y2'))

t = T2()
t.f()

返回:

{'x1', 'x2', 'y1', 'y2', 'z1'}

方法mro()为您提供方法解析顺序。这是Python访问的类列表,用于查找方法。因此,如果一个方法没有在子类中退出,那么将在该列表的类中查找它。如果最后一个类没有此属性,则会抛出AttributeError。在这里,我们使用此列表在父项列表中搜索属性fields,并将所有找到的集合放在结果集fields中。