我应该使用"self"来定义类实例的变量/对象,我不需要从外部访问它们吗?

Phi*_*hil 6 python oop python-2.x python-2.7

我不是一个完全的初学者,但对Python来说还是个新手.虽然今天在一个项目上工作,我只是有了一个想法,并想知道" 自我 " 的用法; 关于过去我一直在阅读的内容,我仍然无法弄清楚它是否总是必要的.我的问题只涉及类和实例参数/变量的实例.这个问题与关于所有实例的类变量无关.

示例:

class C:
    def __init__(self, parent = None):
        super(C, self).__init__(parent)
        self.some_temp_var = AnotherClass()
        self.important_property = self.some_temp_var.bring_the_jewels()

ins_c = C()
print ins_c.important_property 
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我在两个变量声明(some_temp_varimportant_property)之前使用self.

将需要稍后从外部访问**important_property**(实例已创建实例),甚至可能修改它.

但我不需要访问AnotherClass()的实例和/或指向它的变量(some_temp_var).我只需要一次类的实例,我只需执行一次其方法bring_the_jewels来填充important_property的值.

在声明该变量之前我还应该使用self吗?

self.some_temp_var = ....
self.important_property = ....
Run Code Online (Sandbox Code Playgroud)

或者可以是:

some_temp_var = ....
self.important_property = ....
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助.

PS.我做了很长时间的研究.由于缺乏我的英语和/或CS知识,我可能没有找到目前存在的重复,但是我进行了搜索并且我搜索了很多.在将此问题称为"重复"或"不具有建设性"之前,请仔细阅读.这是一个明确答案的问题,这是非常重要的,也是复杂的问题.谢谢你的理解.

jdi*_*jdi 8

如果你不使用self.some_temp_var,那么你正在定义一个局部变量,它将在构造函数之后被垃圾收集.

所以是的,self如果你想定义一个应该与实例一起存在的实例属性,你需要.无论您需要公开还是私密,都需要命名.使用_for protected或__private 进行前缀.

如果some_temp_var只是构造函数的临时性而你再也不需要它那么不,你不需要self.它是关于持久性和成员属性的.您不需要self在单个方法中使用变量的纯事实.

考虑一下......如果some_temp_var您构建了一些巨大的数据结构以获得真实的结果值,该怎么办?你不想用来self存储一个临时变量,因为在你删除它或实例之前它不会释放内存.您希望在不再需要时将其清理干净.