当前位置: 首页 > 面试题库 >

是否所有成员变量都应在__init__中初始化

甄霖
2023-03-14
问题内容

也许这比技术问题更像是一种样式问题,但是我有一个包含多个成员变量的类,并且我想让它起作用,以便在用户第一次创建该类的实例时初始化一些成员变量(即在该__init__功能),我想其他的成员变量从成员函数参数,将稍后被称为定义。所以我的问题是我应该初始化函数中的所有成员变量__init__(并将稍后定义的变量设置为虚拟值)还是初始化__init__函数中的某些成员以及后续函数中的某些成员变量。我意识到这可能很难理解,因此这里有一些示例。

此示例var3最初在__init__函数中设置为0 ,然后在my_funct函数中设置为所需值。

class myClass(object):
   def __init__(self,var1,var2):
        self.var1=var1
        self.var2=var2
        self.var3=0

  def my_funct(self,var3):
       self.var3=var3

在这个例子中,var3根本没有在__init__函数中定义

class myClass(object):
   def __init__(self,var1,var2):
        self.var1=var1
        self.var2=var2

  def my_funct(self,var3):
       self.var3=var3

我认为这两种方式都不会有很大的不同(也许在内存使用方面有细微的差别)。但是我想知道由于某种原因,其中一个是否比另一个更可取。


问题答案:

在面向对象的编程中,开发人员应确保实例化后以及方法完成后,对象始终处于一致状态。除此之外,您还可以随意开发类(请记住带有子类化/重写等的某些原则)。

当您在外部设置实例变量时,诸如Pylint之类的工具会发出警告__init__。可以争论的是,在中设置所有实例变量__init__更为简洁,但这并不是任何时候都必须遵守的规则。



 类似资料:
  • 问题内容: 考虑一下: 我不明白 “ b”从不初始化,但会给出与“ c”相同的运行时错误,这是编译时错误。为什么局部变量和成员之间存在差异? 编辑:将成员设为私有是我的初衷,但问题仍然存在… 问题答案: 确定分配的规则非常困难(请阅读JLS第三版的第16章)。在字段上强制执行明确分配是不现实的。就目前而言,甚至可以在初始化最终字段之前观察它们。

  • 主要内容:使用“键值对”初始化结构体,使用多个值的列表初始化结构体,初始化匿名结构体结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。 使用“键值对”初始化结构体 结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。 键值对的

  • 本文向大家介绍C ++静态成员变量及其初始化,包括了C ++静态成员变量及其初始化的使用技巧和注意事项,需要的朋友参考一下 静态C ++成员变量是使用static关键字定义的。类中的静态成员变量由所有类对象共享,因为在内存中只有它们的一个副本,而与该类的对象数量无关。 如果没有以任何其他方式初始化静态类成员变量,则在创建类的第一个对象时将其初始化为零。 给出了一个演示静态成员变量及其在C ++中的

  • 问题内容: 我需要使用类似于php的isset函数的东西。我知道php和java截然不同,但是php是我先前类似编程知识的唯一基础。是否有某种方法可以返回一个布尔值,用于确定实例变量是否已初始化。例如… 到目前为止,我遇到了这个问题,当我的程序试图隐藏或删除尚未构造的对象时,出现运行时错误。 问题答案: 假设您对是否已为变量 明确赋值 感兴趣,答案是“不是真的”。但绝对的字段(实例变量或类变量)尚

  • C++标准1998的一些相关摘录: 根据标准,静态初始化发生在动态初始化之前,动态初始化可能发生在输入之后。我的问题是:在输入之前,全局变量是否初始化为?然后,如果所有线程都是在输入之后创建的,则全局变量的静态初始化保证是线程安全的。

  • 我想创建一个由TreeNode对象组成的Tree数据结构。根是一个TreeNode。每个TreeNode都有一个父TreeNode和一个子TreeNode列表。树是递归构建的。我简化了代码,使这个例子不太难。函数工作正常。当没有TreeNode的child_values并且返回空列表时,递归结束。这非常好。 每个TreeNode的子节点成员不正确。脚本收集列表(node_list)中的所有Tree