在 __init__ 之外初始化实例变量时会发生什么

What happens when you initialize instance variables outside of __init__

在python中当你初始化一个实例变量(例如self.my_var)你应该在你的class __init__函数中进行,这样内存就被正确保留了对于每个实例的这个变量(<--我的错误,见下文)。当你想定义 class 级变量时,你可以在函数之外进行,并且没有 self 前缀。

当您在一个函数内实例化一个变量而不是 __init__ 并带有 self 前缀时会发生什么?它的行为就像一个普通的实例变量,是否有令人信服的理由不这样做?除了使代码逻辑隐含的危险之外,这已经是一个足够的理由,但我想知道如果你这样做,你是否可能 运行 内存或其他隐藏的问题?

我找不到在某处讨论过的内容。

更新 抱歉

我误解了一些答案,包括这里的第一个和第三个 Python __init__ and self what do they do?(寻找其他答案) 并认为 __init__ 是某种特殊类型的函数,认为它以某种方式具有内存分配功能(!?)。错误的问题。

__init__方法没有什么特别之处。唯一让 __init__ 有趣的是它在您调用 MyClass().

时被调用

以下是等价的:

# Set inside __init__
class MyClassA:
    def __init__(self):
        self.x = 0
obj = MyClassA()

# Set inside other method
class MyClassB:
    def my_initialize(self):
        self.x = 0
obj = MyClassB()
obj.my_initialize()

# Set from outside any method, no self
class MyClassC:
    pass
obj = MyClassC()
obj.x = 0

创建实例变量的原因是您分配它的时间,这可以发生在任何地方。另请注意 self 也不是特殊的,它只是一个普通的函数参数(事实上,您可以将其命名为 self 以外的其他名称)。

so that the memory is properly reserved for this variable per instance.

您不需要 "reserve memory" Python。对于普通对象实例,当您分配 self.x = 0obj.x = 0 时,它有点像在字典中放入一个值。事实上,

# This is sometimes equivalent, depending on how obj is defined
obj.__dict__['x'] = 0

这与"reserving memory"无关。 Python不是C;写 Python 时绝对不要考虑内存分配。

作为一种动态语言,Python 在您设置属性的任何地方都以完全相同的方式运行,并且 __init__ 在创建属性时没有任何特权。

不过,这样做的主要原因是它可以为您的 class 提供一致的界面。如果您在创建实例时至少不分配占位符,则访问该属性的任何代码都需要先检查它是否存在。

也就是说,仍然有很多用例动态注释属性是有用且完全可以接受的。

__init__ 是 python classes 的一种构造函数,当你用 self 定义一个变量时,就像 self.abc 它变成了一个对象属性,可以可以通过自身或对象访问。它在对象创建时初始化。

当您在 __init__ 外部定义变量或在 class 内部定义任何函数而没有 self 时,它将成为 class 的静态属性。并且对于 class.

的所有实例保持不变

如果你在 class 的其他成员函数中使用 self 定义它,它与你在 __init__ 中所做的非常相似,只是在实例化时不会自动调用, 但你必须明确地调用它

我正在寻找这个问题的答案,因为我在方法而不是 __init__ 方法中定义了一个全局变量,它没有影响我的代码。 但是当我需要在另一个方法中使用该变量时——在调用启动该变量的方法之前——,它不起作用。显然,变量还没有定义! 所以,答案是我们在 __init__ 方法中定义所有全局变量,因为它会在您从 class 创建实例后执行。因此,从一开始就定义所有变量,并在任何即将到来的方法中随时使用它们。
使用普通方法初始化全局变量,将强制您在以任何进一步方式使用该变量之前先执行此方法。