要执行的子类层次结构中的链方法,以获取层次结构中所有方法执行的联合



>让我们考虑一下我的要求的简化版本

class Base:
def __method(self):
self.base = 'my-base'

class SubClass(Base):
def __method(self):
self.sub = 'my-sub'

我希望我的子类实例同时包含字段基

让我们考虑一下我对实际要求的尝试

from configargparse import ArgParser

class BaseConf(object):
def __init__(self) -> None:
super().__init__()
self._parser = ArgParser()
self.__add_arg()
def pop(self, args):
first_base = self.__class__.__bases__[0]
if first_base is not object:
super().__populate_arg(args) # <----------Compile failure------->
self.__populate_arg(args)
def __add_arg(self):
self._parser.add_argument('--base', type=str, default='NA')
def __populate_arg(self, args):
self.base = args.base

class SubConf(BaseConf):
def __init__(self) -> None:
super().__init__()
self.__add_arg()
def __add_arg(self):
self._parser.add_argument('--sub', type=str, default='NA')
def __populate_arg(self, args):
self.sub = args.sub

conf = SubConf()
args, _ = conf._parser.parse_known_args()
conf.pop(args)
assert all(x in conf.__dict__ for x in ['base', 'sub'])

最终,我希望断言条件通过。我已经提到了通过标记编译失败来引起麻烦的代码行。

我也会考虑彻底改革整体方法并尝试更好的方法。

谢谢你的时间。

正如我在评论中所说,使用名称破坏__private方法的全部意义在于确保属性/方法是私有的——它们被限制为仅由该类使用——而不是它的子类。您可以通过删除前导下划线、使方法_protectedpublic来轻松解决此问题。例如:

class Base:
def method(self):
self.base = 'my-base'
class SubClass(Base):
def method(self):
self.sub = 'my-sub'
super().method()

这是非常不明智的,但是如果您绝对必须从基类中获取私有属性,那么您可以使用

class Base:
def __method(self):
self.base = 'my-base'
class SubClass(Base):
def method(self):
self.sub = 'my-sub'
super()._Base__method()

但这只有在您知道超类的名称时才有效。如果你不这样做,你必须变得非常黑客,比如

class SubClass(Base):
def method(self):
self.sub = 'my-sub'
sup = self.__class__.mro()[1].__name__
getattr(super(), f'_{sup}__meth')()

最新更新