我应该使用“自我”定义变量/我将不再需要从外部到达的类的对象实例化?(Should I use “s

2019-08-05 02:31发布

我不是一个完整的初学者,但相当新的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_varimportant_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阅读。 这是有明确答案的问题,这是非常重要的,复杂的事情。 感谢您的理解。

Answer 1:

如果你不使用self.some_temp_var ,那么你定义将被垃圾收集构造后的局部变量。

所以,是的,你需要self ,如果你想定义应与实例坚持一个实例属性。 无论你需要它是公共或私有的命名的问题。 与作为前缀_用于保护或__私人。

如果some_temp_var仅仅是构造一个临时,你永远不需要再次则没有,你不需要self 。 它是关于持久性和成员属性。 你不需要self与一个单一的方法中的变量工作的纯粹的事实。

考虑这个...如果some_temp_var是你建立在真实的结果值到达一些巨大的数据结构? 您不想使用self存储的临时变量,因为它不会释放内存,直到被删除或实例。 你希望它清理当不再需要它。



Answer 2:

看起来你并不需要在所有那么变量:

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()


Answer 3:

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?