记ABC类的bug
监听模式中,建了模式父类 class Observer(ABCMate): @abstractmethod def update(self,waterHeater): pass 洗澡模式: class WashingMode(Observer): def update(self,waterHeater): if 50 < waterHeater.getTemperature() < 70: print('水烧好了,可以洗澡啦!') 饮用模式: class DrinkingMode(Observer): def update(self,waterHeater): if waterHeater.getTemperature() >= 100: print('水烧开了,可以饮用了!') 实例化对象调用时: waterHeater = WaterHeater() washing = WashingMode() drink = DrinkingMode() waterHeater.addObserver(washing,drink) waterHeater.setTemperature(60) waterHeater.setTemperature(120) 报错: Traceback (most recent call last): File "E:/python设计模式/监听模式.py", line 52, in <module> washing = WashingMode() TypeError: __new__() missing 3 required positional arguments: 'name', 'bases', and 'namespace' 将waterHeater传入后还报错: washing = WashingMode(waterHeater) drink = DrinkingMode(waterHeater) Traceback (most recent call last): File "E:/python设计模式/监听模式.py", line 52, in <module> washing = WashingMode(waterHeater) TypeError: __new__() missing 2 required positional arguments: 'bases' and 'namespace' 所以去看ABCMate源码,发现ABC只是他的子类,用于更规范继承用的,而ABCMate类的__new__方法确实存在错误中的位置参数,百度无果,自己改为继承ABC类,将实例的waterHeater对象不传入washing和drink实例对象就好了,这里自己还没理解,所以记录下来,之后填坑。
###################################################
哈哈哈,蠢哭了,自己又研究了一下,在继承ABCMate类的正确写法是:metaclass=ABCMate。ABC可以直接继承,原来ABC的源码里的注释意思是ABC可以像继承类一样直接写类名,而ABCMate类就得加上mateclass,恍然大悟啊,着实尴尬,看来以后看源码得多思考了,不能太肤浅。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人