如何在 super 调用的 class 方法中找到当前基数 class?

How can I find the current base class in a classmethod invoked by super?

如何在 super 调用的 class 方法中找到当前基数 class?

我希望方法数据收集上升到基础 classes 的 _data 值。

class A:
  _data = "A data"
  @classmethod
  def data(cls) -> list[str]:
    # gather data here too, we may have N number of inheritance classes so we should try to invoke super here too

class B(A):
  _data = "B data"
  @classmethod
  def data(cls) -> list[str]:
    # gather data here and invoke super to gather data from A also

可以用 super().__thisclass__ 得到当前基数 class 使用此解决方案,我们可以编写满足这些要求的以下代码:

  • Class B 继承自 A
  • 两种数据方法中的代码必须相同,并且不应包含文字 class 引用,例如 A 或 B
class A:
    _data = "A data"
    @classmethod
    def data(cls):
        super_instance = super()
        this_cls = super_instance.__thisclass__
        try:
            other_data = super_instance.data()
        except AttributeError:
            return [this_cls._data]
        return [this_cls._data] + other_data

class B(A):
    _data = "B data"
    @classmethod
    def data(cls):
        super_instance = super()
        this_cls = super_instance.__thisclass__
        try:
            other_data = super_instance.data()
        except AttributeError:
            return [this_cls._data]
        return [this_cls._data] + other_data

B.data()
# ['B data', 'A data']

或者可以将其重构为更短的:

class DataGatherer:
    @staticmethod
    def gather_data(super_instance):
        this_cls = super_instance.__thisclass__
        try:
            other_data = super_instance.data()
        except AttributeError:
            return [this_cls._data]
        return [this_cls._data] + other_data


class A(DataGatherer):
    _data = "A data"
    @classmethod
    def data(cls):
        return cls.gather_data(super())

class B(A):
    _data = "B data"
    @classmethod
    def data(cls):
        return cls.gather_data(super())