PyScript中用Pirate类重构海盗翻译程序遇错求助
原代码出错原因
- 实例方法被当作类方法调用:
Pirate.translate_english是实例方法,必须先创建Pirate类的实例才能调用。直接通过类名调用时,Python会自动把类本身作为第一个参数传入,但方法里期望的是实例对象(self),参数不匹配直接引发报错。 - 输入值获取时机错误:原
Pirate类的__init__方法在类实例化时就获取了输入框的值,此时页面刚加载,输入框是空的;就算后续输入内容,点击按钮时也不会重新读取最新的输入值,翻译结果永远是初始空值的翻译。
正确实现方案
这里提供两种更规范的实现方式,比你提到的修改方案更贴合面向对象设计:
方案一:将方法改为类方法
不需要实例化类,直接通过类调用方法,同时在方法内部实时获取输入值:
# main.py import arrr from pyscript import document class Pirate: @classmethod def translate_english(cls): input_text = document.querySelector("#english") english = input_text.value output_div = document.querySelector("#output") output_div.innerText = arrr.translate(english)
对应的HTML按钮保持原写法即可:
<button py-click="Pirate.translate_english">Translate</button>
方案二:保留实例方法,通过函数封装实例化逻辑
这种方式更灵活,适合后续扩展类的功能:
# main.py import arrr from pyscript import document class Pirate: def __init__(self): self.input_text = document.querySelector("#english") self.output_div = document.querySelector("#output") def translate_english(self): # 实时获取最新输入值 english = self.input_text.value self.output_div.innerText = arrr.translate(english) # 封装点击触发的函数 def handle_translate(): pirate = Pirate() pirate.translate_english()
对应的HTML按钮修改为:
<button py-click="handle_translate">Translate</button>
补充说明
你提到的两种修改方案能运行的原因:
- 修改方案1:调用
Pirate2.__init__时,PyScript会自动创建实例并执行__init__,此时__init__里的逻辑会实时获取输入值并翻译,但直接调用__init__不符合Python的编码规范。 - 修改方案2:通过中间函数实例化类并调用方法,本质和上述方案二一致,是规范的实现方式。
内容的提问来源于stack exchange,提问作者PedroBiel
相关产品推荐
相关产品推荐

