在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 = 0
或obj.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__
只是在实例化时它不会自动调用,但你必须显式调用它