gpt4 book ai didi

python - 子类层次结构中的链式方法执行以获得层次结构中所有方法执行的联合

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:22 25 4
gpt4 key购买 nike

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

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


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

我希望我的 SubClass 实例包含字段 basesub

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

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 方法的全部意义在于确保属性/方法是 private —— 它们仅限于使用由那个类——不是它的子类。您可以通过删除前导下划线、创建方法 _protectedpublic 轻松解决此问题。例如:

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

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

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

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

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

但这只有在您知道父类(super class)的名称时才有效。如果你不这样做,你必须变得非常 hacky,比如

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

关于python - 子类层次结构中的链式方法执行以获得层次结构中所有方法执行的联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51965541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com