调用self.Reflector(xchar)报错:'str'对象不可调用
类方法调用报错:'str' object is not callable
错误信息
Traceback (most recent call last): File "/Users/.../Encrypt.py", line 35, in <module> Cipher = machine.Process_Message(Message, replace_char=replaceVal) File "/Users/.../EGdevice.py", line 104, in Process_Message code = self.Encode(char) File "/Users/.../EGdevice.py", line 136, in Encode xchar = self.Reflector(xchar) TypeError: 'str' object is not callable dennis@MBP2021 enigma %
相关代码片段
def Encode(self, char): # Run charactor through the process logging.info(f'Original char: {char}') xchar = self.Plug_Board(char) logging.info(f'Recived Plugboard char: {xchar}') self.Rotate_Rotors() xchar = self.Thru_Roters_Forward(xchar) logging.info(f'Recive Forword Rotor char: {xchar}') xchar = self.Reflector(xchar) logging.info(f'Recived Relector char: {xchar}') xchar = self.Thru_Roters_Backword(xchar) logging.info(f'Recive Backward Rotor char: {xchar}') xchar = self.Plug_Board(xchar) logging.info(f'Last Plugboard char: {xchar}') return str(xchar) def Thru_Roters_Forward(self, char): # Run thru the rotors from right to left. for x in reversed(range(self.rotorCount)): pos = int(self.rotorDetails[x][1]) xchar = str(self.rotorDetails[x][3][pos][0]) logging.info(f'Input: {char} Returned: {xchar}') return str(xchar) def Reflector(self, char): xchar = self.Reflector[(ord(char) - 65) % 26] logging.info(f'Input: {char} Returned: {xchar}') return str(xchar)
日志输出
2023.03.15 19:48:30|INFO| >> FNC: Process_Message() MSG: Input data: This is the day the Lord has made. Be glad and rejoice. 2023.03.15 19:48:30|INFO| >> FNC: Encode() MSG: Original char: T 2023.03.15 19:48:30|INFO| >> FNC: Plug_Board() MSG: Input: T Returned: M 2023.03.15 19:48:30|INFO| >> FNC: Encode() MSG: Recived Plugboard char: M 2023.03.15 19:48:30|INFO| >> FNC: Thru_Roters_Forward() MSG: Input: M Returned: K 2023.03.15 19:48:30|INFO| >> FNC: Encode() MSG: Recive Rotor char: K
问题说明
处理字符串时,前两次类方法调用正常,但调用self.Reflector(xchar)时触发上述错误。已尝试确保返回值为字符串,仍无法解决。
解决方案
核心问题是实例属性与方法重名:
你的类中,存储反射器字符映射的实例属性(比如self.Reflector)和类方法Reflector同名了,导致self.Reflector指向的是字符串类型的属性,而非方法,调用时自然触发“字符串不可调用”的错误。
修正步骤:
- 修改存储反射器映射的实例属性名称,比如改为
self.reflector_map(避免与方法名冲突); - 更新
Reflector方法内的访问代码:
def Reflector(self, char): # 使用改名后的实例属性访问映射 xchar = self.reflector_map[(ord(char) - 65) % 26] logging.info(f'Input: {char} Returned: {xchar}') return str(xchar)
同时检查类的初始化代码,确保反射器映射的变量名是修改后的self.reflector_map,避免再次出现命名冲突。
内容的提问来源于stack exchange,提问作者BigD
相关产品推荐
相关产品推荐

