成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

[[205503]]

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

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

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

Python 中的私有制

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

  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)象的原理簡單明了:以 __ 打頭并且不以 __ 結(jié)尾的屬性變量,都會自動更名為 _類名__變量名。比如上面的 __age 實際名字是 _Person__age。如果外界不認(rèn)這個私有,直接訪問 _Person_age 是可以破壞這個私有制的。所以這個私有制是建立在開發(fā)者之間的默契的基礎(chǔ)上:“你既然這么設(shè)計了,說明這個變量你不希望我訪問或者修改,那我就不訪問或者修改了”,并不是建立在強制力的基礎(chǔ)上。

訪問權(quán)限控制

私有制的一個大用處就是控制訪問,讓一些變量可讀不可寫。比如寫成下面那樣,我們就可以通過 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 是構(gòu)建了一個新變量 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 的目標(biāo)是提供一些非***信息游戲環(huán)境和一些基線模型算法,方便 AI 開發(fā)人員快速地構(gòu)建、測試和對比自己的非***游戲 AI 算法。目前 RoomAI 已經(jīng)支持德州、梭哈和七鬼。RoomAI 的基本流程如下所示:玩家 AI 獲得游戲環(huán)境給出的信息,當(dāng)前玩家 AI 選擇合適的動作,游戲環(huán)境根據(jù)該動作推進(jìn)游戲邏輯;重復(fù)上述過程,直到分出勝負(fù)。給玩家 AI 的信息必須進(jìn)行訪問權(quán)限控制,那么玩家 AI 有可能通過信息獲取游戲秘密或者操縱游戲。

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

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

總結(jié)

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

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

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

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2013-10-16 14:36:55

網(wǎng)絡(luò)私有制

2013-10-09 15:43:49

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

2015-12-29 10:10:04

私有云虛擬化公共云

2012-11-01 13:53:23

公有云私有云阿里云

2011-09-29 09:48:39

私有云PaaS云計算

2012-03-27 14:25:23

私有云PaaS云計算

2022-03-17 08:30:28

Python私有屬性私有方法

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

2013-11-29 11:13:04

電視智能家居多屏互動

2020-06-05 09:38:33

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

2010-06-03 16:09:23

Ubuntu私有驅(qū)動

2018-08-27 16:10:49

2014-11-28 12:58:36

云服務(wù)私有云混合云

2009-06-30 19:12:16

云計算SOAIT

2011-11-02 09:36:51

私有云云計算
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩有码一区 | 国家aaa的一级看片 h片在线看 | 美女黄色在线观看 | 日韩视频一区在线观看 | 精品国产成人 | 午夜性色a√在线视频观看9 | 欧美日韩综合一区 | 不卡的av在线| 91亚洲欧美| 日韩成年人视频在线 | 波多野结衣中文视频 | 欧美日韩亚洲一区二区 | 91精品国产综合久久香蕉麻豆 | 日本中文字幕一区 | 国产视频久久久 | 91精品在线播放 | 欧美在线国产精品 | 国产综合欧美 | 欧美精品久久久久久久久老牛影院 | 国产精品大片在线观看 | 欧美激情在线播放 | 中文字幕在线观看av | 一区二区三区欧美大片 | a视频在线| av网站在线免费观看 | 秋霞国产 | 91精品国产综合久久香蕉922 | 久热精品在线 | 成人精品视频 | 在线成人免费视频 | 欧美一区久久 | 最新国产精品 | 亚洲一区二区免费 | 九色 在线| 国产一区二区三区四区在线观看 | 欧美成人在线网站 | 亚洲精品久久久久久一区二区 | 亚洲字幕在线观看 | 国产一区中文字幕 | 91久久精品一区二区二区 | 欧美成人一级视频 |