自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

靠默契保證的私有制:Python 中的私有

開發(fā) 開發(fā)工具
在大部分面向?qū)ο蟮木幊陶Z言中,對象可以設置其變量和方法為私有。私有變量和方法只能自己使用,即使其子對象都不能訪問。大部分編程語言中的私有制,和現(xiàn)實生活中的私有制一樣,也是有強制力保證的。只是這部分強制力來自編程語言本身。

人類文明開化以來,私有制似乎是人類歷史的主流在西方國家,“私有財產(chǎn)神圣不可侵犯” 是很多資本主義國家的立國原則之一。在我國,“私有財產(chǎn)不可侵犯” 也是寫在憲法中的。在人類社會中,私有制表面由由法律保證,實質(zhì)上是有法律背后的國家強制力保證。

[[205503]]

試圖反映世界萬物的編程語言,便也產(chǎn)生了私有的概念。在大部分面向?qū)ο蟮木幊陶Z言中,對象可以設置其變量和方法為私有。私有變量和方法只能自己使用,即使其子對象都不能訪問。大部分編程語言中的私有制,和現(xiàn)實生活中的私有制一樣,也是有強制力保證的。只是這部分強制力來自編程語言本身。比如下面的 Java 代碼

  1. public class Person{ 
  2.    private int money = 0 

Java 語言強制地讓 money 只能內(nèi)部訪問。但并不是所有編程語言都是這樣的,Python 就是其中一朵奇葩。Python 中的私有制是由默契保證的。

Python 中的私有制

我們知道 Python 是一門很隨意的編程語言,并沒有由語言提供的權限控制機制。雖然 Python 對象中的所有屬性都可以被外界訪問,但我們可以構造出一個偽私有來,如下面的代碼。

  1. class Person: 
  2.     def __init__(self):  
  3.         self.__age = 10 

上面的代碼定義了一個 Person 類, 有 __age 表示的年齡屬性。神奇的事情發(fā)生了:

  1. >> p = Person() 
  2. >> p.__age 
  3. Traceback (most recent call last): 
  4.  File "<stdin>", line 1, in <module> 
  5. AttributeError: Person instance has no attribute '__age' 

Person 的對象中沒有年齡屬性。噢耶,私有制完成。這個現(xiàn)象的原理簡單明了:以 __ 打頭并且不以 __ 結尾的屬性變量,都會自動更名為 _類名__變量名。比如上面的 __age 實際名字是 _Person__age。如果外界不認這個私有,直接訪問 _Person_age 是可以破壞這個私有制的。所以這個私有制是建立在開發(fā)者之間的默契的基礎上:“你既然這么設計了,說明這個變量你不希望我訪問或者修改,那我就不訪問或者修改了”,并不是建立在強制力的基礎上。

訪問權限控制

私有制的一個大用處就是控制訪問,讓一些變量可讀不可寫。比如寫成下面那樣,我們就可以通過 age() 訪問年齡屬性了。

  1. class Person: 
  2.     def __init__(self):  
  3.        self.__age = 10 
  4.     def age(self): 
  5.        return self.__age 

對于 Python 可讀不可寫變量,我們需要注意有兩點和其他語言不一樣。***點是 Python 提供了 property 修飾符,可以讓函數(shù)看起了像變量,但***不用。這是因為看起來像變量,不是很熟悉內(nèi)部機制的開發(fā)者很容易去改動它,比如下面的例子。

  1. class Person: 
  2.     def __init__(self):  
  3.        self.__age = 10 
  4.     @property 
  5.     def age(self): 
  6.        return self.__age 
  7.  
  8. >> p = Person() 
  9. >> p.age 
  10. 10 
  11. >> p.age = 25 
  12. >> p._Person__age 
  13. 10 
  14. >> p.age 
  15. 25 

p.age = 25 是構建了一個新變量 age = 25, 原來的 .age 就不見了。這時候雖然實際的年齡屬性 _Person__age 并沒有被改變,但程序通過 .age 訪問不到它了。

第二點是需要注意聚合類型的屬性變量。聚合類型變量中的 list, set 和 dict 中的元素可變。如果一個對象的屬性變量是這些聚合類型,那么可以通過修改其元素的方式改變其內(nèi)容,如下所示。

  1. class Person: 
  2.     def __init__(self):  
  3.        self.__lessons = ["Chinese","English","Math"] 
  4.     
  5.     def lessons(self): 
  6.        return self.__lessons 
  7.  
  8. >> p = Person() 
  9. >> p.lessons 
  10. ["Chinese","English","Math"] 
  11. >> p.lessons[0] = "CS" 
  12. >> p.lessons 
  13. ["CS","English","Math"] 

解決這個問題的辦法就是用 tuple, fronzenset 和 fronzendict。

  1. class Person: 
  2.     def __init__(self):  
  3.        self.__lessons = ["Chinese","English","Math"] 
  4.     
  5.     def lessons(self): 
  6.        return tuple(self.__lessons) 

RoomAI 的例子

最近在開發(fā)非***信息游戲 AI 環(huán)境:RoomAI (點擊原文可以查看 RoomAI)。RoomAI 的目標是提供一些非***信息游戲環(huán)境和一些基線模型算法,方便 AI 開發(fā)人員快速地構建、測試和對比自己的非***游戲 AI 算法。目前 RoomAI 已經(jīng)支持德州、梭哈和七鬼。RoomAI 的基本流程如下所示:玩家 AI 獲得游戲環(huán)境給出的信息,當前玩家 AI 選擇合適的動作,游戲環(huán)境根據(jù)該動作推進游戲邏輯;重復上述過程,直到分出勝負。給玩家 AI 的信息必須進行訪問權限控制,那么玩家 AI 有可能通過信息獲取游戲秘密或者操縱游戲。

為了實現(xiàn)這個目的,之前的做法是深度拷貝游戲環(huán)境給出的信息。了解了 Python 私有和訪問權限控制,我們很容易想到用這套機制改造之。改造之后,我們通過 RoomAI 中 5 個 AI 對戰(zhàn) 10000 局七鬼游戲?qū)嶒灒瑢Ρ瓤截惙椒ê驮L問控制方法的效率。

其中原始 copy 是直接使用 copy.deepcopy 進行拷貝,改進拷貝是自己實現(xiàn)了 __ deepcopy __ 函數(shù),訪問控制則是使用私有變量從而使得信息可讀不可寫。很明顯地,訪問控制方法效率比拷貝方法的高不少。

總結

試圖反映世界萬物的編程語言也有私有的概念。在大部分面向?qū)ο蟮木幊陶Z言中,對象可以設置其變量和方法為私有。私有變量和方法只能自己使用,即使其子對象都不能訪問。大部分編程語言中的私有制,和現(xiàn)實生活中的私有制一樣,也是有強制力保證的。只是這部分強制力來自編程語言本身。但并不是所有編程語言都是這樣的,Python 就是其中一朵奇葩。Python 中的私有制是由默契保證的。私有制的作用之一就是訪問控制,可以使得某些屬性可讀不可寫。我們將這個做法用到非***信息游戲 AI 環(huán)境 RoomAI 中,提供了運行的效率。

【本文為51CTO專欄作者“李立”的原創(chuàng)稿件,轉載請通過51CTO獲取聯(lián)系和授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2013-10-16 14:36:55

網(wǎng)絡私有制

2013-10-09 15:43:49

云平臺私有制網(wǎng)絡

2015-12-29 10:10:04

私有云虛擬化公共云

2012-11-01 13:53:23

公有云私有云阿里云

2022-03-17 08:30:28

Python私有屬性私有方法

2012-03-27 14:25:23

私有云PaaS云計算

2011-09-29 09:48:39

私有云PaaS云計算

2011-09-15 09:31:32

云計算PaaS私有云

2012-07-31 16:34:46

私有云公有云

2023-09-16 19:38:17

Python私有屬性私有方法

2020-04-21 10:42:23

私有云多云云遷移

2018-09-10 15:21:17

私有云裸金屬

2015-05-28 13:42:08

2020-06-05 09:38:33

云計算私有云互聯(lián)網(wǎng)

2013-11-29 11:13:04

電視智能家居多屏互動

2010-06-03 16:09:23

Ubuntu私有驅(qū)動

2018-08-27 16:10:49

2009-06-30 19:12:16

云計算SOAIT

2014-11-28 12:58:36

云服務私有云混合云

2011-11-02 09:36:51

私有云云計算
點贊
收藏

51CTO技術棧公眾號