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

Python如何在不同函数间引用变量并修复现有代码运行异常问题

代码错误点及修复方案

1. 变量未定义就使用(直接导致运行报错)

  • 成因:main函数中先执行Person、Customer的实例化逻辑,再调用input获取用户输入给n/a/p/nu/m变量赋值,实例化时这些变量还未创建,会直接触发NameError。
  • 修复方法:调整执行顺序,先收集所有用户输入,再用拿到的值实例化对象。

2. Customer类方法引用了作用域外的变量

  • 成因:get_mailinglist方法中直接使用了m变量,而m是main函数的局部变量,类实例方法的作用域无法访问到该变量,调用该方法时会触发NameError。
  • 修复方法:方法内访问自身的实例属性self.mailing_list做判断,不要引用外部变量。

3. 类设计逻辑割裂

  • 成因:Person类定义了自然人的基础属性,但Customer作为客户类没有继承Person,两个类完全独立,同一个客户的信息被拆分存储在两个无关的实例中,后续调用和维护都会出问题。
  • 修复方法:让Customer类继承Person,实例化Customer时一次性传入所有属性,不需要单独创建Person实例。

4. 不符合类封装的设计规范

  • 成因:代码中定义了get_*系列取值方法,但打印时直接访问了实例属性,虽然语法上不会报错,但违背了类封装的设计初衷。
  • 修复方法:打印时调用对应的get方法取值即可。

main函数内变量传递到自定义函数的实现方法

如果需要把main中的变量传递到其他自定义函数,有两种常用方案:

  • 把需要传递的变量作为函数参数,调用函数时直接传入即可。例如你定义了独立打印函数def print_customer(name, phone):,在main中调用时写print_customer(n, p)就能把变量值传进去。
  • 如果是类的实例方法,就把变量值在实例化时赋值给实例属性,后续类的所有实例方法都可以通过self.属性名直接访问,不需要额外传参。

修复后完整可运行代码

class Person:
    def __init__(self, name, address, phone):
        self.name = name
        self.address = address
        self.phone = phone
    
    def set_name(self, name):
        self.name = name
    
    def set_address(self, address):
        self.address = address
    
    def set_phone(self, phone):
        self.phone = phone
    
    def get_name(self):
        return self.name
    
    def get_address(self):
        return self.address
    
    def get_phone(self):
        return self.phone


# Customer类继承Person,复用人员基础属性
class Customer(Person):
    def __init__(self, name, address, phone, number, mail):
        # 调用父类初始化方法赋值基础属性
        super().__init__(name, address, phone)
        self.number = number
        self.mailing_list = mail
    
    def set_number(self, number):
        self.number = number 
    
    def set_mailinglist(self, mail):
        self.mailing_list = mail
    
    def get_number(self):
        return self.number
    
    def get_mailinglist(self):
        # 访问自身实例属性判断,兼容大小写输入
        if self.mailing_list.upper() == 'Y':
            return '是'
        elif self.mailing_list.upper() == 'N':
            return '否'
        # 增加非法输入兜底
        return '未设置'
    

def main():
    # 先收集所有用户输入
    n = input('请输入客户姓名: ')
    a = input('请输入客户地址: ')
    p = input('请输入客户电话号码: ')
    nu = int(input('请输入客户编号: '))
    m = input('是否将客户加入邮件列表 [Y/N]?: ')
    
    # 用收集到的输入实例化客户对象,所有信息存储在同一个实例中
    customer = Customer(name=n, address=a, phone=p, number=nu, mail=m)
    
    # 调用get方法打印所有信息
    print('客户姓名:', customer.get_name())
    print('客户地址:', customer.get_address())
    print('客户电话号码:', customer.get_phone())
    print('客户编号:', customer.get_number())
    print('是否加入邮件列表:', customer.get_mailinglist())
    
if __name__ == '__main__':
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:06