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



在python中,当你初始化一个实例变量(例如self.my_var( 你应该在你的类__init__函数中执行此操作,以便为每个实例正确保留内存为这个变量((。当您想要定义类级别变量时,您可以在函数外部进行,并且没有self前缀。

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

我不能在某处找不到讨论过的问题。

更新抱歉

我误解了一些答案,包括这里的第一个和第三个 Python __init__ 和 self 他们做什么?(寻找其他人( 并认为__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以外的其他名称(。

以便为每个实例的此变量正确保留内存。

你不需要在Python中"保留内存"。 对于普通对象实例,当您分配self.x = 0obj.x = 0时,这有点像将值放入字典中。 事实上

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

这与"保留内存"无关。Python 不是 C;在编写 Python 时,您绝对不应该考虑内存分配。

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

但是,在那里这样做的主要原因是,它随后为您的类提供了一致的接口。如果在创建实例时未至少分配占位符,则访问该属性的任何代码都需要首先检查它是否存在。

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

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

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

当您定义__init__外部的变量或类中的任何函数而不self时,它将成为该类的静态属性。 并且对于该类的所有实例都保持不变。

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

相关内容

最新更新