记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,恍然大悟啊,着实尴尬,看来以后看源码得多思考了,不能太肤浅。


复制代码

 

posted on   不要挡着我晒太阳  阅读(457)  评论(0编辑  收藏  举报

编辑推荐:
· 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训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示