我刚刚开始使用Python进行编程,并且还有与OOP相关的东西,我并不十分清楚。因此在Python中,您可以创建新值并为其赋值,而无需先声明它。那么,在函数内部(例如write.graph
)创建和分配新变量(例如。self.variable = 5
)与创建和分配新的私有成员变量之间是否有任何区别?在我看来,根本没有任何区别。
__init__()
答案 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)
protected
和public
之间的差异是一个惯例问题。以 一个 _
为前缀的类或成员变量向开发人员表明“除非您知道自己在做什么,否则不要使用它”。私有是 稍微 的不同情况,但是:它们需要两个_
,并且不能以多个_
为后缀。 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>