Python类方法调用报错:NameError: name 'self' is not defined 求助
问题解决思路
核心错误原因
你直接通过类名调用实例方法name_and_max_value,还手动传了self——但self是Python在调用实例对象的方法时自动传入的参数,你既没创建Rate类的实例,也没定义过名为self的变量,所以会报NameError。
分步修复方案
1. 修复类的构造方法__init__
你的__init__写法有两个错误:
- 方法名格式错误:
__ init__要改成__init__(前后双下划线,中间无空格) - 赋值逻辑颠倒:应该把传入的
format_赋值给实例属性,不是反过来
修正后:
def __init__(self, format_): self.format = format_
2. 正确创建类实例并调用方法
不能直接用类名调用实例方法,必须先创建Rate的实例,再通过实例调用方法:
# 创建Rate类的实例,传入format参数 rate_instance = Rate('full') # 通过实例调用方法,无需手动传self max_value = rate_instance.name_and_max_value()
3. 修复方法内的业务逻辑错误
你的name_and_max_value方法还存在逻辑问题:
- 请求返回的JSON结构里,
Value和Previous是在Valute字典下的具体货币条目里,不是根节点 - 没有使用用户输入的
valute参数来指定要查询的货币
修正后的方法:
def name_and_max_value(self, format_='full'): """返回指定货币的名称及最高汇率(当前/昨日)""" self.r = requests.get('https://www.cbr-xml-daily.ru/daily_json.js') # 获取所有货币数据 valutes = self.r.json()['Valute'] # 将用户输入转为大写,匹配API里的货币代码(比如USD) target_valute = valutes.get(valute.upper()) if not target_valute: return f"未找到货币:{valute}" # 比较当前汇率和昨日汇率,取较大值 max_val = max(target_valute["Value"], target_valute["Previous"]) # 根据format参数返回对应格式 if format_ == 'full': return f"{target_valute['Name']}的最高汇率为:{max_val}" else: return max_val
4. 完整修复后的代码
import requests valute = input('Enter currency name: ') class Rate: def __init__(self, format_): self.format = format_ def name_and_max_value(self, format_='full'): """返回指定货币的名称及最高汇率(当前/昨日)""" self.r = requests.get('https://www.cbr-xml-daily.ru/daily_json.js') valutes = self.r.json()['Valute'] target_valute = valutes.get(valute.upper()) if not target_valute: return f"未找到货币:{valute}" max_val = max(target_valute["Value"], target_valute["Previous"]) if format_ == 'full': return f"{target_valute['Name']}的最高汇率为:{max_val}" else: return max_val # 创建实例并调用方法 rate = Rate('full') print(rate.name_and_max_value())
关键知识点补充
- 实例方法的第一个参数
self代表类的实例对象,Python会在调用实例方法时自动传递,不需要手动传入 - 调用实例方法必须先创建类的实例(比如
rate = Rate(...)),再通过实例调用(rate.name_and_max_value()) - 如果要直接通过类名调用方法,需要把方法定义为类方法(用
@classmethod装饰,第一个参数是cls)或者静态方法(用@staticmethod装饰,无默认参数),但你的场景更适合用实例方法
内容的提问来源于stack exchange,提问作者pythonlamer
相关产品推荐
相关产品推荐

