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
相关产品推荐
相关产品推荐

