我听说过Python中不存在除了对象内部之外无法访问的“私有”实例变量:as seen here
但是,我们可以使用python中的getter和setter方法创建私有变量,如下所示
class C(object):
def getx(self):
return self._x
def setx(self, value):
self._x = value
x = property(fset=setx)
c = C()
c.x = 2
print c.x
当我尝试访问c.x时,我收到如下错误:
Traceback (most recent call last):
File "d.py", line 12, in <module>
print c.x
AttributeError: unreadable attribute
c.x不可访问的事实是否表示x的行为类似于私有变量?这个事实与上面的链接中的内容有什么关系?
答案 0 :(得分:2)
有很多关于这个主题的文献,但简而言之:
Python与实际上具有&#34;私有&#34;的编程语言不同。属性,其他功能无法真正访问任何属性。是的,我们可以使用property
模拟Java等语言的行为,如您所示,但这有点捏造&#34; true&#34;私人属性。 property
实际上是一个更高阶的函数(从技术上来说,它是一个装饰者),所以当你打电话给c.x
时,尽管它是一个属性,你真的是引用一个函数来控制是否可以使用其中定义的getter和setter。
但仅仅因为c.x
不允许直接读取权限,并不意味着您无法调用print c._x
(正如@avigil指出的那样)。因此c._x
并非真正私密 - 它与属于C
类的任何其他属性一样容易访问。它的名字以下划线开头的事实只是一个惯例 - 给同事们的一个信号:&#34;请不要直接处理这个变量,而是使用getters / setters来代替&#34; (如果有的话)。
答案 1 :(得分:0)
是的,Python确实支持私有变量。 您可以在类中声明私有变量,如下所示:
__variableName = someValue
双下划线(__),后跟一个变量和一些赋值。 下面的示例将帮助您获得私有变量的可访问性:
class Book:
publisher = 'xyz' #public variable
_comm = 12.5 #protected variable
__printingCost = 7 #private variable
def printPriVar(self):
print(self.__printingCost)
b = Book()
print(b.publisher)
print(b._comm)
#print(Book.__printingCost) #Error
#print(b.__printingCost) #Error