自人类文明以来,私有制似乎是人类历史的主流在西方国家,“私有财产神圣不可侵犯”是其立国原则之一许多资本主义国家。在我国,“私有财产神圣不可侵犯”也写进了宪法。在人类社会中,私有制表面上是有法律保障的,但实质上是由法律背后的国家强制力保障的。一种试图反映世界上一切事物的编程语言也产生了隐私的概念。在大多数面向对象的编程语言中,对象可以将其变量和方法设为私有。私有变量和方法只能自己使用,甚至不能访问它们的子对象。大多数编程语言中的私有制,就像现实生活中的私有制一样,是通过强制来保证的。只是这部分强制力来自编程语言本身。例如,下面的Java代码publicclassPerson{privateintmoney=0}Java语言强制货币只能在内部访问。但并不是所有的编程语言都是这样,Python就是其中之一。Python中的隐私由默认协议保证。Python中的私有制我们知道,Python是一种非常随意的编程语言,语言本身并没有提供权限控制机制。虽然Python对象中的所有属性都可以被外界访问,但是我们可以构造一个伪私有的,比如下面的代码。classPerson:def__init__(self):self.__age=10上面的代码定义了一个Person类,其年龄属性由__age表示。奇迹发生了:>>p=Person()>>p.__ageTraceback(mostrecentcalllast):File"",line1,inAttributeError:Personinstancehasnoattribute'__age'Person在对象中没有年龄属性。哦,是的,私有制是完整的。这种现象的原理简单明了:以__开头不以__结尾的属性变量会自动重命名为_类名__变量名。例如,上面__age的实际名称是_Person__age。如果外界不承认这种私有制,直接访问_Person_age就可以破坏这种私有制。所以这种私有制是基于开发者之间的默契:“既然你这样设计了,就代表你不想让我访问或修改这个变量,那我就不访问或修改”,而不是基于在强制力的基础上。访问控制私有所有权的一大用途是控制访问并使某些变量可读但不可写。例如,如下所示,我们可以通过age()访问年龄属性。classPerson:def__init__(self):self.__age=10defage(self):returnsself.__age对于Python可读不可写变量,我们需要注意两点与其他语言不同的地方。最重要的一点是Python提供了属性修饰符,可以让函数看起来像变量,但绝对不是。这是因为它看起来像一个变量,对内部机制不是很熟悉的开发者可以很容易地改变它,比如下面的例子。classPerson:def__init__(self):self.__age=10@propertydefage(self):returnself.__age>>p=Person()>>p.age10>>p.age=25>>p._Person__age10>>p.age25p.age=25是新建一个变量age=25,原来的.age没有了。此时虽然实际年龄属性_Person__age没有改变,但是程序无法通过.age访问到它。第二点需要注意聚合类型的属性变量。聚合类型变量中list、set、dict中的元素是可变的。如果一个对象的属性变量是这些聚合类型,那么它的内容可以通过修改它的元素来改变,如下所示。classPerson:def__init__(self):self.__lessons=["Chinese","English","Math"]deflessons(self):returnself.__lessons>>p=Person()>>p.lessons["Chinese","English","Math"]>>p.lessons[0]="CS">>p.lessons["CS","English","Math"]这个问题的解决方法是使用元组,fronzenset和狂热分子。classPerson:def__init__(self):self.__lessons=["Chinese","English","Math"]deflessons(self):returntuple(self.__lessons)RoomAI最近开发的非****信息AI环境实例游戏:RoomAI(点击原文查看RoomAI)。RoomAI的目标是提供一些非***信息游戏环境和一些基线模型算法,让AI开发者可以快速构建、测试和比较自己的非***游戏AI算法。目前RoomAI已经支持TexasHold'em、Stud和SevenGhosts。RoomAI的基本流程如下:玩家AI获取游戏环境给出的信息,当前玩家AI选择合适的动作,游戏环境根据动作推进游戏逻辑;重复以上过程,直到分出胜负。提供给玩家AI的信息必须受到访问控制,然后玩家AI可以使用这些信息来获取游戏秘密或操纵游戏。为了达到这个目的,之前的做法是深度复制游戏环境给出的信息。在了解了Python的隐私和访问控制之后,我们很容易想到用这种机制来改造它。改造后,我们通过RoomAI中5个AI对战10000轮七鬼游戏的实验,比较了复制方式和访问控制方式的效率。原始副本使用copy.deepcopy直接复制,改进后的副本是实现__deepcopy__函数,访问控制是使用私有变量使信息可读不可写。显然,访问控制方式比复制方式要高效得多。总结试图反映世间万物的编程语言也有私有的概念。在大多数面向对象的编程语言中,对象可以将其变量和方法设为私有。私有变量和方法只能自己使用,甚至不能访问它们的子对象。大多数编程语言中的私有制,就像现实生活中的私有制一样,是通过强制来保证的。只是这部分强制力来自编程语言本身。但并不是所有的编程语言都是这样,Python就是其中之一。Python中的隐私由默认协议保证。私有制的功能之一是访问控制,可以使某些属性可读不可写。我们将这种方法应用于非海量信息游戏的AI环境RoomAI,以提高运营效率。【本文为专栏作家“李莉”原创稿件,转载请联系授权】点此查看该作者更多好文