通过继承连接类变量?

2024-09-29 22:00:26 发布

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

我试图通过继承来隐式地连接类变量。我能升一级,但不能再升了。。。这真的有可能吗?你知道吗

class Base(object):
    def get_crumbs(self):
        crumbs = getattr(super(self.__class__, self), 'crumbs', ())
        crumbs += getattr(self, 'crumbs', ())
        return crumbs


class A(Base):
    crumbs = ('un chasseur', )


class B(A):
    crumbs = ('sachant chasser', )


class C(B):
    crumbs = ('sans son chien', 'est un bon chasseur')


>>> c = C()
>>> c.get_crumbs()
>>> <type 'tuple'>: ('sachant chasser', 'sans son chien', 'est un bon chasseur')

Tags: selfbasegetclassunestbonsans
1条回答
网友
1楼 · 发布于 2024-09-29 22:00:26

您可以在^{} tuple上循环:

class Base(object):
    def get_crumbs(self):
        crumbs = []
        for cls in type(self).__mro__:
            crumbs.extend(getattr(cls, 'crumbs', ()))
        return tuple(crumbs)

演示:

>>> class Base(object):
...     def get_crumbs(self):
...         crumbs = []
...         for cls in type(self).__mro__:
...             crumbs.extend(getattr(cls, 'crumbs', ()))
...         return tuple(crumbs)
...
>>> class A(Base):
...     crumbs = ('un chasseur',)
...
>>> class B(A):
...     crumbs = ('sachant chasser',)
...
>>> class C(B):
...     crumbs = ('sans son chien', 'est un bon chasseur')
...
>>> c = C()
>>> c.get_crumbs()
('sans son chien', 'est un bon chasseur', 'sachant chasser', 'un chasseur')

旁注:永远不要使用super(self.__class__, self)。如果重写get_crumbs()方法并使用super()调用原始方法,则会导致无限递归,请参见How to avoid infinite recursion with super()?。改用super(ClassName, self)或(仅限python3)super()。你知道吗

相关问题 更多 >

    热门问题