You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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")犯了两个小错:

  1. print()函数的返回值是None——它只会在控制台输出内容,但本身不会返回任何有效数据,所以你的self.email从一开始就被赋值成了None
  2. __init__只在创建human1时执行一次,所以email的值在实例诞生时就固定成None了,后续修改name1根本不会触发重新计算。

问题2:取消print(human1.email)注释后两次返回None

当你取消注释后,代码会执行两次print(human1.email)

  • 第一次:创建human1时,__init__里的print()已经输出了邮箱字符串,但self.emailNone,所以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时,都会用当前最新的name1name2生成邮箱地址,完美解决你的两个问题~

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

火山引擎 最新活动