gpt4 book ai didi

python - 构造函数(Python)之外的方法中的实例变量 - 为什么以及如何?

转载 作者:太空狗 更新时间:2023-10-29 22:15:15 25 4
gpt4 key购买 nike

我的问题涉及在类构造函数之外的方法中初始化的实例变量。这是针对 Python 的。

我先说说我的理解:

  1. 类可以定义构造函数,也可以定义其他方法。
  2. 实例变量通常在构造函数中定义/初始化。
  3. 但是实例变量也可以在构造函数之外定义/初始化,例如在同一类的其他方法中。
  4. (2) 和 (3) 的例子——参见中的self.meowself.roar下面的类:

    class Cat():

    def __init__(self):
    self.meow = "Meow!"
    def meow_bigger(self):
    self.roar = "Roar!"

我的问题:

  1. 为什么最好在构造函数中初始化实例变量?

  2. 如果在构造函数以外的方法中定期初始化实例变量,会出现什么一般/特定的困惑情况? (例如,在他的 Python 编程中阅读了 Mark Lutz 的 Tkinter 指南,我认为它非常棒,我注意到用于保存 PhotoImage 对象/引用的实例变量是在进一步的方法中初始化的,而不是在构造函数中。它似乎没有工作问题在那里,但从长远来看,这种做法会导致问题吗?)

  3. 在什么情况下,在其他方法中而不是在构造函数中初始化实例变量更好


  1. 据我所知,实例变量不在类对象创建时存在,而是在类对象实例化之后存在。继续我上面的代码,我证明了这一点:

    >> c = Cat() 
    >> c.meow
    'Meow!'
    >> c.roar
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    AttributeError: 'Cat' object has no attribute 'roar'
    >>> c.meow_bigger()
    >>> c.roar
    'Roar!'

    可以这样说:

    • 一开始我无法访问实例变量 (c.roar)。
    • 但是,在我调用了一次实例方法c.meow_bigger() 之后,我突然能够访问实例变量c.roar
    • 为什么会出现上述行为?

感谢您帮助我理解。

最佳答案

Why is it best practice to initialize the instance variable within the constructor?

清晰度。

因为这样可以很容易地一目了然地看到类的所有属性。如果在多个方法中初始化变量,不阅读每一行代码就很难理解完整的数据结构。

__init__ 中初始化也使文档更容易。对于您的示例,您不能编写“Cat 的实例具有 roar 属性”。相反,您必须添加一段说明 Cat 的实例可能具有“roar”属性,但仅在调用“meow_louder”方法之后。

清晰度为王。我见过的最聪明的程序员之一曾经告诉我“给我看你的数据结构,我可以告诉你你的代码是如何工作的,而无需看你的任何代码”。虽然这有点夸张,但绝对有道理。学习代码库的最大障碍之一是理解它操作的数据。

What general/specific mess could arise if instance variables are regularly initialized in methods other than the constructor?

最明显的一个是对象可能没有在程序的所有部分都可用的属性,导致必须添加大量额外的代码来处理未定义属性的情况。

In what scenarios would it be better to initialize instance variables in the other methods, rather than in the constructor?

我认为没有。

注意:您不一定要用它的最终值来初始化属性。在您的情况下,将 roar 初始化为 None 是可以接受的。它已被初始化为某物 的事实表明它是该类维护的一段数据。如果值稍后发生变化也没关系。

关于python - 构造函数(Python)之外的方法中的实例变量 - 为什么以及如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38377276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com