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
相关产品推荐
相关产品推荐

