You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:能否基于已有的父类instance创建子类instance?

核心问题

TL;DR:Python环境下,我有Parent类、Child类,以及一个Parent类的实例——parent。能不能创建一个Child类的实例,让它的super()指向parent?

具体使用场景(已有替代方案)

我想创建Python logging模块中Logger类的实例,并重写它的_log方法。logger.info或logger.error等方法会传入INFO或ERROR等level参数调用该方法,我只想替换这一个方法,其余部分保持不变并能无缝运行。

效果不佳的方案

  • 无法直接继承logging.Logger并重写方法和构造函数,因为Logger的实例通常通过工厂方法logging.getLogger(name)创建,没法像下面这样重载包装类的构造函数并期望正常工作:
class WrappedLogger(logging.Logger):
    def __init__(self, ...):
        super().__init__(...)

    def _log(self, ...):
  • 可以创建包装类,提供.info或.error等需要调用的方法,但得手动处理所有情况,而且当_log方法被多层调用嵌套时,没法保证包装类的所有调用都会触发我想要的_log方法。

  • 可以用临时方案:

class WrappedLogger(logging.Logger):
    def __init__(self, parent):
        self._parent = parent

    def _log(...): # 重载方法

    def __getattr__(self, method_name):
        return getattr(self._parent, method_name)

调用wrapped.info(...)时,会获取父类的info方法并调用,进而调用self._log(即包装类的方法),但这种方式很不优雅。

  • 类似地,直接获取Logger的常规实例并手动替换方法,比上面的方式稍好,但还是不尽如人意。

核心疑问

这个问题已经被多次提出,但场景略有不同,当时给出的都是替代方案。我不想找替代方案,就想知道有没有原生方法,可以指定父类实例来构造子类实例。

相关问题

  • Create child class instances from parent class instance, and call parent methods from child class instance——此处给出了一种替代方案
  • Python construct child class from parent——此处父类可在子类构造函数中创建

内容的提问来源于stack exchange,提问作者Bennet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:05:23