初始化发生在哪里,在 init 方法中还是在实例声明中?

Posted

技术标签:

【中文标题】初始化发生在哪里,在 init 方法中还是在实例声明中?【英文标题】:Where is initialization taking place, in the init method or in the instance declaration? 【发布时间】:2015-09-02 16:39:26 【问题描述】:

请不要让我去阅读苹果网站上的链接,因为我已经阅读了所有内容!

我对属性“文本”的实际初始化发生在哪里感到困惑?是在 init 方法中还是在实例声明中发生?

因为在我看来,text 属性的初始化是在实例声明中发生的,它被赋予值“甜菜怎么样?”

如果是这样,那为什么苹果书规定必须在创建实例之前初始化所有属性?在类定义中(如果我错了,请纠正我)

最后,如果'text'实际上是在类定义中初始化的......初始化在哪里??

class SurveyQuestion 

let text: String
var response: String?
init(text: String) 
    self.text = text
  
func ask() 
    print(text)
   

  let beetsQuestion = SurveyQuestion(text: "How about beets?")

【问题讨论】:

【参考方案1】:

初始化发生在init 方法中。请注意,init 采用一个参数 text,并将该参数分配给 self.text

【讨论】:

那么在 text 属性中初始化了什么值?我在这里看到的只是一个分配给 self.text 的空变量...?? 是否满足初始化......设置一个空变量作为self.text的值?? @Ali:不,在initself.text = texttext 参数分配给self.textself.text 永远不会为空。它在声明时没有值(在let text: String 中),但在对象被初始化之前你根本不能使用它,所以self.text 永远不会为空。 .....文本参数从发送值“甜菜怎么样?”的实例声明中获取其值......正确吗? 所以从技术上讲,类定义在创建它的实例之前不会运行......?【参考方案2】:

我相信您的代码中遵循的过程是:

    您调用 SurveyQuestion(text: "How about beets?") 以获取 SurveyQuestion 类的实例。 当类运行时,它的初始化方法init(text: String) 会初始化所有属性。这意味着您正在初始化 text 属性,并为其赋予一个值。 最后,该类完成初始化,您将获得该类的一个实例。

这对应于 Apple 的文档,因为当您初始化类时,属性会被初始化,但在 init 方法完成之前您不会获得类实例,这意味着直到所有属性都被初始化。

对不起,初始化冗余,我没有找到另一种解释方式。 希望能解决你的疑惑。

【讨论】:

以上是关于初始化发生在哪里,在 init 方法中还是在实例声明中?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不使用 __init__ 的情况下在实例初始化时自动运行方法?

Python中的__init__和__new__介绍

在 Python 中初始化一个字符串变量:“”还是无?

我应该总是为失败的初始化方法释放自我吗?

类的初始化__init__使用

类加载过程(clinit()),对象实例化过程(init())