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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:36:08