如何在 super 调用的 class 方法中找到当前基数 class?
How can I find the current base class in a classmethod invoked by super?
如何在 super 调用的 class 方法中找到当前基数 class?
- Class B 继承自 A
- 两种数据方法中的代码必须相同,并且不应包含文字 class 引用,如 A 或 B
我希望方法数据收集上升到基础 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())
如何在 super 调用的 class 方法中找到当前基数 class?
- Class B 继承自 A
- 两种数据方法中的代码必须相同,并且不应包含文字 class 引用,如 A 或 B
我希望方法数据收集上升到基础 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())