为什么Python类__init__中用self.age判断报AttributeError,用age参数正常?
报错原因解析
- Python实例化类的时候,构造方法
__init__的执行逻辑是按代码顺序从上到下运行的,在给实例属性赋值之前,实例上不存在对应的属性。 - 你写的初始代码中,
if self.age >=18这行判断的执行时机,在self.age = age赋值语句之前。此时实例self还没有被绑定age属性,读取不存在的实例属性自然会抛出AttributeError。
修改后代码正常运行的原因
你把判断条件改成直接使用__init__的形参age,这个参数是实例化时传入的参数值,在__init__方法被调用时就已经完成赋值,属于方法内的局部变量,不需要依赖实例属性就能直接读取,因此不会报错。
额外优化提示
你当前的代码逻辑存在隐藏问题:如果传入的年龄小于18,判断不通过的情况下,不会给实例绑定
name、age、miles三个属性,后续你访问这些属性或者调用run、name_1方法依然会报错。建议补充else分支处理不符合年龄条件的情况,比如直接抛出参数异常:
def __init__(self,name,age,miles): if age>=18: self.name=name self.age=age self.miles=miles else: raise ValueError("学生年龄必须大于等于18")
内容的提问来源于stack exchange,提问作者le_gheeya
相关产品推荐
相关产品推荐

