如何在Python中扩展包含所有超类值的列表?

2024-04-25 11:55:46 发布

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

我的目的是以最简单的方式得到一个完整的列表,其中包含分配给每个高级类中的变量的值。你知道吗

class First:
    list = []
    def get_final_list(self):
        return self.list

class Second(First):
    list = ['one']

class Third(Second):
    list = ['two']

结果:list=['one','two']

这是最终结果的一个例子,但是很明显,返回这个值的函数的整个逻辑都丢失了。你知道吗


Tags: self目的列表getreturndef方式one
2条回答

最近我做了类似的事情,我希望子类能够在其父类的属性中定义附加的值。您可以使用metaclasses来实现这一点,它允许您以类允许您钩住实例创建的方式钩住类创建。你知道吗

例如,在您的案例中,您可以执行以下操作:

class ListCombiner(type):
    def __new__(cls, name, bases, dct):
        l = []
        for base in bases:
            l = getattr(base, 'list', []) + []
        dct['list'] = l + dct.get('list', [])
        return type.__new__(cls, name, bases, dct)

class First(metaclass=ListCombiner):
    list = []
    def get_final_list(self):
        return self.list

class Second(First):
    list = ['one']

class Third(Second):
    list = ['two']

结果是:

>>> Third().list
['one', 'two']

有关元类的更多信息,请参见What are metaclasses in Python?

如果您真的感兴趣,您可以看到我在this commit中介绍它的地方;这说明了我是如何用元类替换一些笨拙的代码的。事实上,我是使用集合使它稍微容易,因为我不关心的顺序。你知道吗

如何使用适当的方法等,而不是仅仅在类中的字段?你知道吗

class First:
    def list(self):
        return []
    def get_final_list(self):
        return self.list

class Second(First):
    def list(self):
        return super().list() + ['one']

class Third(Second):
    def list(self):
        return super().list() +  ['two']

然后您可以:

Third().list() # returns ['one', 'two']

相关问题 更多 >