我不是一个完整的初学者,但相当新的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
在上面的代码中,我两个变量声明(some_temp_var和important_property)之前使用自 。
我需要从(其中实例的创建),甚至修改它的外面在稍后访问 ** ** important_property。
但我不会需要访问()AnotherClass的实例和/或变量指向它(some_temp_var)。 我只需要它类的一个实例一次,我需要执行的方法bring_the_jewels一次来填充important_property的价值。
如果我仍然宣称变量以及之前使用的自我?
self.some_temp_var = ....
self.important_property = ....
或者也可以是:
some_temp_var = ....
self.important_property = ....
谢谢您的帮助。
PS。 我做我的研究在长度的方式。 由于缺乏自己的英语和/或CS的知识,我可能没有发现当前存在的重复,但是我没有搜索,我做搜索了很多。 在调用这个问题之前“重复”或“没有建设性”,请throughly阅读。 这是有明确答案的问题,这是非常重要的,复杂的事情。 感谢您的理解。
如果你不使用self.some_temp_var
,那么你定义将被垃圾收集构造后的局部变量。
所以,是的,你需要self
,如果你想定义应与实例坚持一个实例属性。 无论你需要它是公共或私有的命名的问题。 与作为前缀_
用于保护或__
私人。
如果some_temp_var
仅仅是构造一个临时,你永远不需要再次则没有,你不需要self
。 它是关于持久性和成员属性。 你不需要self
与一个单一的方法中的变量工作的纯粹的事实。
考虑这个...如果some_temp_var
是你建立在真实的结果值到达一些巨大的数据结构? 您不想使用self
存储的临时变量,因为它不会释放内存,直到被删除或实例。 你希望它清理当不再需要它。
看起来你并不需要在所有那么变量:
class C:
def __init__(self, parent=None):
super(C, self).__init__(parent)
self.important_property = AnotherClass().bring_the_jewels()
在回答您的评论:
我需要把自己。 如果它要创建的是盈,参考和使用过程中一旦__init__
。
不,你不知道。 使用普通的变量,然后,对象将是垃圾收集后__init__
退出。
class C:
def __init__(self, parent = None):
super(C, self).__init__(parent)
some_temp_var = AnotherClass()
self.important_property = some_temp_var.bring_the_jewels()
Python没有真正区分“私人”变量“公共”。 分配给使用“self.something =价值”自我名字的东西都会成为该实例的实例变量。
Python做有两个公约是与此有关:
1)Python的字段或方法的前缀为下划线(“_”)来告诉用户这是不是这个类之外的关注“。 单下划线标识或多或少什么样的C#语言会叫一个“保护”变量的传统方式:这是内部的执行,并应单独留在家中,除了这个类和派生类。 双下划线就像是一个C#“私有”变量:它的内部并应甚至派生类单独留在家中,它不能被重写
class Example(object):
def __init__(self)
self._protected= "protected"
self.__private = "private"
self.public = "public"
class Derived(Example):
pass
d = Derived()
print d._protected
>> protected
print d.__private
>> AttributeError: 'Derived' object has no attribute '__private'
严格地说单下划线只不过是一个拼写惯例 。 双下划线并实际裂伤的名称类中,以防止继承。
2)你的例子是可能的情况下使用的财产装饰,如果AnotherClass实际上是要流连,如果操纵AnotherClass实例会影响AnotherClass的状态。
class C:
def __init__(self, parent = None):
super(C, self).__init__(parent)
self._private = AnotherClass()
@property
def public(self):
return self._private.some_method_on_AnotherClass()
@public.setter
def set_pub(self, val)
self._private.set_value_on_AnotherClass(val)
文章来源: Should I use “self” to define variables / objects of class instanced which I will not need to reach from the outside?