【发布时间】:2019-01-28 15:17:47
【问题描述】:
让我们考虑一下我的要求的简化版本
class Base:
def __method(self):
self.base = 'my-base'
class SubClass(Base):
def __method(self):
self.sub = 'my-sub'
我希望我的 SubClass 实例包含 base 和 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'])
最终我希望断言条件通过。我已经通过标记 Compile failure 提到了导致问题的代码行。
我还会考虑彻底改革整体方法并尝试更好的方法。
感谢您的宝贵时间。
【问题讨论】:
-
super().__method()总是会失败,因为这就是在__method中使用名称修饰双下划线的全部意义所在。这确保此方法是私有方法,只能由该类本身访问(通过正常方式)。你为什么要这样做?为什么不让Base.method()和SubClass.method()打电话给super().method()?
标签: python python-3.x inheritance decorator