python是否支持私有变量?

时间:2018-03-22 04:01:28

标签: python encapsulation

我听说过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的行为类似于私有变量?这个事实与上面的链接中的内容有什么关系?

2 个答案:

答案 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