为了账号安全,请及时绑定邮箱和手机立即绑定

如何引用 __init__ 超类中定义的函数

如何引用 __init__ 超类中定义的函数

尚方宝剑之说 2023-06-20 15:15:03
def convert(dictionary我的类中有一个辅助函数 ( )__init__来协助配置设置。定义如下:class Configuration:    def __init__(self, config_file=None, config=None):        if config_file is not None:            with open(config_file) as in_file:                self._config = yaml.load(in_file, Loader=yaml.FullLoader)        elif config is not None:            self._config = config        else:            raise ValueError("Could not create configuration. Must pass either location of config file or valid "                             "config.")        def convert(dictionary):            return namedtuple('Config', dictionary.keys())(**dictionary)这使我可以按如下方式拨打电话__init__:        self.input = convert(self._config["input"])        self.output = convert(self._config["output"])        self.build = convert(self._config["build_catalog"])由于我要设置多个配置,因此我想从他的类中继承如下:class BuildConfiguration(Configuration):    def __init__(self, config_file=None, config=None):        super().__init__(config_file, config)        self.input = convert(self._config["input"])        self.output = convert(self._config["output"])        self.build = convert(self._config["build_catalog"])convert但是,我无法从父类访问。我也试过这个:self.input = super().__init__.convert(self._config["input"])这似乎也行不通。所以问题是如何访问super().__init__子类中定义的函数?
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

你不能。每次调用都会创建一个新函数,__init__然后将其丢弃,它不存在于函数之外。请注意,这也适用于由创建的类namedtuple('Config', dictionary.keys())(**dictionary)。继续创建所有这些不必要的类确实不好,这完全违背了namedtuple创建内存高效记录类型的目的。在这里,每个实例都有自己的类!


以下是您应该如何定义它:


Config = namedtuple('Config', "foo bar baz")


def convert(dictionary): # is this really necessary?

    return Config(**dictionary) 


class Configuration:


    def __init__(self, config_file=None, config=None):


        if config_file is not None:

            with open(config_file) as in_file:

                self._config = yaml.load(in_file, Loader=yaml.FullLoader)

        elif config is not None:

            self._config = config

        else:

            raise ValueError("Could not create configuration. Must pass either location of config file or valid "

                             "config.")


        self.input = convert(self._config["input"])

        self.output = convert(self._config["output"])

        self.build = convert(self._config["build_catalog"])

虽然在这一点上,使用它似乎更干净


Config(**self._config["input"])

etc 而不是 helper convert。


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信