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

如何实现BellTower类sound()方法调用未知数量BigBell与LittleBell实例的sound()方法并解决'str' object is not callable错误

解决BellTower中调用sound()时的TypeError问题

嘿,我一眼就看出问题所在啦——你在LittleBell和BigBell类里犯了一个常见的命名冲突错误:实例变量self.sound和方法sound()同名了!

问题根源

当你在类的__init__方法里给self.sound赋值为字符串(比如'ding'),这会直接覆盖掉你之后定义的sound()方法。因为Python中,实例属性会优先于类方法被访问,所以当你调用elem.sound()时,实际上是在尝试调用一个字符串对象,这就触发了TypeError: 'str' object is not callable错误。

修复方案

只需要把存储声音内容的实例变量名改一下,和方法名彻底区分开就行。比如改成_sound或者sound_str这类不会和方法名冲突的名字。

下面是修复后的完整代码:

class LittleBell:
    def __init__(self):
        # 修改实例变量名,避免和方法sound()冲突
        self._sound = 'ding'
    def sound(self):
        print(self._sound)

class BigBell:
    def __init__(self):
        self.checker = True
        # 同样修改实例变量名
        self._sound = 'ding'
        self._bigsound = 'dong'
    def sound(self):
        if self.checker:
            print(self._sound)
            self.checker = False
        else:
            print(self._bigsound)  # 修正原代码逻辑,让BigBell交替输出ding和dong
            self.checker = True

class BellTower:
    def __init__(self, *bells):
        self.bells = list(bells)
    def sound(self):
        for elem in self.bells:
            elem.sound()
        print('...')

# 测试验证
bell_tower = BellTower(BigBell(), LittleBell())
bell_tower.sound()  # 输出:ding ding ...
bell_tower.sound()  # 输出:dong ding ...

额外小修正

顺便提一句,你原来的BigBell.sound()方法里,第二个分支还是输出了self.sound,这不符合BigBell交替响铃的逻辑,我在修复代码里也把这个小问题修正了,现在它会正确交替输出ding和dong。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:53:14