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

Let*_*zee 5 python software-design

在python中初始化一个实例变量(例如self.my_var)时,你应该在你的类__init__函数中执行它,以便为每个实例的这个变量正确保留内存(< - 我的错误,见下文).如果要定义类级变量,可以在函数外部进行,而不使用self前缀.

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

我无法找到在某处讨论的内容.

更新 抱歉

我误解了一些答案,包括第一个和第三个Python __init__和self他们做了什么?(寻找其他人)并认为这__init__是一种特殊类型的功能,认为它以某种方式具有内存分配功能(!?).错误的问题.

Die*_*Epp 5

这种__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
Run Code Online (Sandbox Code Playgroud)

实例变量的作用是在分配时,它可以在任何地方发生.还要注意,这self也不是特别的,它只是一个普通的函数参数(实际上,你可以将其命名为除此之外的东西self).

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

您不需要在Python中"保留内存".对于普通的对象实例,当你指定self.x = 0或者obj.x = 0,它有点像在字典中放置一个值.事实上,

# This is sometimes equivalent, depending on how obj is defined
obj.__dict__['x'] = 0
Run Code Online (Sandbox Code Playgroud)