Python入门:__init__方法的行为机制及代码运行异常问题咨询
嘿,作为Python新手碰到__init__的困惑太正常了,我来帮你把问题拆解明白~
先搞懂__init__方法的核心作用
__init__是Python类里的构造初始化方法,当你创建类的实例(比如代码里的human1 = Class("chandra", "Shekar"))时,Python会自动调用这个方法,专门用来给新实例绑定初始属性、做一些初始化操作。
- 它的第一个参数
self必须写,代表当前创建的实例本身,后面的参数是你需要传入的初始化值; - 只有在创建实例的那一刻,
__init__会执行一次,之后除非你手动调用,否则不会再运行。
你的代码问题分析与解决
问题1:修改name1为"yolo"后,email输出没更新
你代码里的self.email = print(f"{self.name1}{self.name2}@google.com")犯了两个小错:
print()函数的返回值是None——它只会在控制台输出内容,但本身不会返回任何有效数据,所以你的self.email从一开始就被赋值成了None;__init__只在创建human1时执行一次,所以email的值在实例诞生时就固定成None了,后续修改name1根本不会触发重新计算。
问题2:取消print(human1.email)注释后两次返回None
当你取消注释后,代码会执行两次print(human1.email):
- 第一次:创建
human1时,__init__里的print()已经输出了邮箱字符串,但self.email是None,所以print(human1.email)会输出None; - 第二次:修改
name1后再打印human1.email,还是输出None,因为这个属性从始至终都是None,和name1的变化无关。
修正后的代码方案
要实现“修改name1后email自动更新”的效果,你需要把email改成动态计算的属性,用Python的@property装饰器就能做到:
class Class(): def __init__(self, namef, namel): self.name1 = namef self.name2 = namel # 把email变成动态属性,每次访问都会重新计算 @property def email(self): return f"{self.name1}{self.name2}@google.com" def introself(self): return f"Hello guys my name is {self.name1}{self.name2} and I am a human" human1 = Class("chandra", "Shekar") print(human1.email) # 输出 chandraShekar@google.com human1.name1 = "yolo" print(human1.email) # 输出 yoloShekar@google.com print(human1.introself()) # 也会自动使用更新后的name1
这样每次访问human1.email时,都会用当前最新的name1和name2生成邮箱地址,完美解决你的两个问题~
内容的提问来源于stack exchange,提问作者VIKING




