Python self.variable vs私有成员实例变量

时间:2016-12-12 14:07:33

标签: python

我刚刚开始使用Python进行编程,并且还有与OOP相关的东西,我并不十分清楚。因此在Python中,您可以创建新值并为其赋值,而无需先声明它。那么,在函数内部(例如write.graph)创建和分配新变量(例如。self.variable = 5)与创建和分配新的私有成员变量之间是否有任何区别?在我看来,根本没有任何区别。

__init__()

5 个答案:

答案 0 :(得分:2)

  

在我看来,根本没有任何区别。

这是正确的。

但请记住,Python没有“私人”成员。这只是一个惯例。

答案 1 :(得分:2)

这两个变量实际上存在差异:

由于__var_A中定义了class Foo而不是像__init__这样的单个成员函数,因此您可以像这样一次更改所有实例:

Foo._Foo__var_A = 2

这不适用于__var_B,因为您为每个实例单独定义它。

但请注意,更改__var_A实例不会为其他所有人更改它,而是将本地覆盖放入对象本身:

foo2 = Foo()
foo2._Foo__var_A = 1
Foo._Foo__var_A = 2
(foo2._Foo__var_A, foo._Foo__var_A) # Returns: (1, 2)

答案 2 :(得分:1)

protectedpublic之间的差异是一个惯例问题。以 一个 _为前缀的类或成员变量向开发人员表明“除非您知道自己在做什么,否则不要使用它”。私有是 稍微 的不同情况,但是:它们需要两个_,并且不能以多个_为后缀。 Here are the docs

  

Python中不存在除对象内部之外无法访问的“私有”实例变量。但是,大多数Python代码都遵循一个约定:前缀为下划线的名称(例如_spam)应被视为API的非公共部分(无论是函数,方法还是数据成员) 。它应被视为实施细节,如有更改,恕不另行通知。

名称修改是Python继承的重要部分。它允许类保护API调用,防止意外操纵后代(参见上面的文档)。但是,如有必要,您仍然可以通过_<class-name><var name>访问它们。例如:

class Foo:
   def __init__(self):
      self.__bar = 1

print(Foo()._Foo__bar)
# 1

答案 3 :(得分:0)

如果变量在class foo:内的__init__(self)下声明,则没有区别。两种方法都完成了同样的事情。

但是,如果从self.bar以外的方法声明变量(例如__init__),则这有点麻烦。使用

def bar(self):
    self.bar = 'test'

在对象中创建一个不属于默认类的变量。你可以这样做,但它不是python的编程实践。

答案 4 :(得分:0)

有区别。请考虑以下示例:

foo = Foo()
foo.__dict__

这将返回:

{'_Foo__var_B': 5}

但是,请遵循以下代码:

bar = Foo
bar.__dict__

将返回

{'_Foo__var_A': 5,
 '__doc__': None,
 '__init__': <function __main__.__init__>,
 '__module__': '__main__',
 'printVars': <function __main__.printVars>}

这可以得出结论,即使__var_A未实例化,Foo也可以访问,而__var_B则不会。{/ p>