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

继承BaseClass的单例类ChildSingletonClass遇AttributeError求助

问题根源

你遇到的AttributeError是因为子类ChildSingletonClass重写了__init__方法,但没有调用父类BaseClass的__init__,导致父类中定义的self.logger属性从未被初始化。

另外,单例模式下Python会在每次获取实例时自动调用__init__,如果不做控制,即使解决了初始化问题,也会重复执行初始化逻辑,这也是需要注意的点。

解决方案

方案一:在子类__init__中调用父类初始化,加标记避免重复执行

from mylogging import MyLogging


class BaseClass:
    def __init__(self) -> None:
        self.logger = MyLogging(logName=self.__class__.__name__)

# Singleton
class ChildSingletonClass(BaseClass):
    __instance = None
    _initialized = False  # 标记是否已完成初始化

    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = super(ChildSingletonClass, cls).__new__(cls)

        return cls.__instance

    def __init__(self):
        if not self._initialized:
            super().__init__()  # 调用父类初始化,创建logger属性
            self.logger.debug(f"{self} address = {id(self)}")
            self._initialized = True

通过_initialized标记,确保__init__中的初始化逻辑只在实例第一次创建时执行一次,避免后续获取实例时重复初始化。

方案二:将初始化逻辑移到__new__中,仅执行一次

from mylogging import MyLogging


class BaseClass:
    def __init__(self) -> None:
        self.logger = MyLogging(logName=self.__class__.__name__)

# Singleton
class ChildSingletonClass(BaseClass):
    __instance = None

    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = super(ChildSingletonClass, cls).__new__(cls)
            super(ChildSingletonClass, cls).__init__(cls.__instance)  # 手动调用父类初始化
            cls.__instance.logger.debug(f"{cls.__instance} address = {id(cls.__instance)}")

        return cls.__instance

    def __init__(self):
        pass  # 留空避免Python自动调用时重复执行初始化

在__new__创建实例后手动调用父类__init__,确保初始化逻辑仅在实例第一次创建时执行,后续获取实例时不会重复触发。

关于你尝试的super(BaseClass, cls)为什么没用

这个修改完全偏离了问题根源——问题出在__init__没有调用父类初始化,和__new__中调用的父类无关,所以改这个不会解决logger未定义的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:34