摘要:因?yàn)榉N種原因,并未提供如一樣的修飾符,換言之,中沒有常量,至少截止年年末,還沒有這個(gè)打算。其實(shí)可以曲線救國(guó)實(shí)現(xiàn)常量。其函數(shù)原型為其中為變量名,為變量值。而則以的形式保存了內(nèi)所有可寫的屬性,為變量名,為變量值。
因?yàn)榉N種原因,Python并未提供如C/C++/Java一樣的const修飾符,換言之,python中沒有常量,至少截止2015年年末,還沒有這個(gè)打算。Python程序一般通過約定俗成的變量名全大寫的形式來表示這是一個(gè)常量,但是這終究不是長(zhǎng)久之計(jì)。
其實(shí)Python可以曲線救國(guó)實(shí)現(xiàn)常量。
在Python的面向?qū)ο笾校?b>object.__setattr__()這個(gè)built-in function在對(duì)類的屬性賦值的時(shí)候會(huì)自動(dòng)調(diào)用。其函數(shù)原型為:
object.__setattr__(self, name, value)
其中name為變量名,value為變量值。
而object.__dict__則以dict的形式保存了object內(nèi)所有可寫的屬性,key為變量名,value為變量值。
那么我們就有可能通過建立一個(gè)const類,對(duì)其object.__setattr__()方法進(jìn)行overwrite,在對(duì)屬性值進(jìn)行賦值的時(shí)候判斷,如果屬性存在,則表示這是對(duì)常量的重賦值操作,從而拋出異常,如果屬性不存在,則表示是新聲明了一個(gè)常量,可以進(jìn)行賦值操作。
const.py 代碼如下:
# -*- coding: utf-8 -*- class _const: class ConstError(TypeError) : pass def __setattr__(self, key, value): # self.__dict__ if self.__dict__.has_key(key): raise self.ConstError,"constant reassignment error!" self.__dict__[key] = value import sys sys.modules[__name__] = _const()
其中,1-10行是上述思路的類的一個(gè)實(shí)現(xiàn)。
第12-14行的寫法值得說明。我們盡管擁有了_const類,但是我們當(dāng)前使用這個(gè)類仍然需要
import const c = const._const() c.TEST_CONSTANT = "test"
這樣的形式來聲明一個(gè)常量TEST_CONSTANT,然而我們希望用更簡(jiǎn)潔的方法進(jìn)行常量的賦值。形如:
import const const.TEST_CONSTANT = "test"
在python中,__name__內(nèi)置屬性是當(dāng)前的class或者type的值。通俗地講,__name__的值有以下兩種形式:
如果運(yùn)行某一個(gè)py文件,在該文件中,__name__的值為"__main__"
如果import了某一個(gè)py文件,那么在該import的文件中,__name__的值為該文件的文件名(不帶.py后綴)
而sys.modules是一個(gè)dict對(duì)象,包括了當(dāng)前上下文中python已經(jīng)load的所有模塊的信息,dict的key為文件名,value為模塊對(duì)象。
在const.py 中,14行的寫法等價(jià)于
import const sys.modules["const"] = _const()
即,讓_const類作為模塊的入口點(diǎn),引入const.py等價(jià)于聲明了一個(gè)_const類的實(shí)例。
至此python的常量實(shí)現(xiàn)完畢,使用test.py測(cè)試:
# -*- coding: utf-8 -*- import const const.TEST = "test" print const.TEST const.TEST1 = "test1" print const.TEST1 const.TEST = "test" print const.TEST
打印信息如下:
test test1 Traceback (most recent call last): File "H:/code/test.py", line 9, inconst.TEST = "test" File "H:codeconst.py", line 9, in __setattr__ raise self.ConstError,"constant reassigning error!" const.ConstError: constant reassignment error!
成功為兩常量賦值,在試圖修改第一個(gè)常量值時(shí)拋出異常:)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37655.html
摘要:本文原文是在開始之前,我要聲明我們要解釋的是技巧。不是最佳實(shí)踐,并且在至少一種情況下,它是不可取的。技巧這些技巧使得我的包管理更容易一點(diǎn)。我很確定我的一些讀者使用這個(gè)技巧會(huì)有一個(gè)嚴(yán)重的問題。盡管如此,因?yàn)檫@些技巧,我喜歡讓事情簡(jiǎn)單明了。 本文原文是 setup.py tricks showImg(http://pydanny.com/static/setup.png); 在...
摘要:序列化的這種過程,我們將其稱為腌制。而把模塊編譯成二進(jìn)制語言程序的這個(gè)過程叫做字節(jié)編譯,這個(gè)過程會(huì)產(chǎn)生一個(gè)與編譯的模塊對(duì)應(yīng)的文件。 常量: 在Python中常量的使用并不像java等其他編程語言一樣有特定的常量實(shí)現(xiàn)的關(guān)鍵字,在Python中定義需要用對(duì)象的方法來創(chuàng)建。 showImg(https://segmentfault.com/img/bVP6mZ?w=1232&h=703); ...
摘要:序列化的這種過程,我們將其稱為腌制。而把模塊編譯成二進(jìn)制語言程序的這個(gè)過程叫做字節(jié)編譯,這個(gè)過程會(huì)產(chǎn)生一個(gè)與編譯的模塊對(duì)應(yīng)的文件。 常量: 在Python中常量的使用并不像java等其他編程語言一樣有特定的常量實(shí)現(xiàn)的關(guān)鍵字,在Python中定義需要用對(duì)象的方法來創(chuàng)建。 showImg(https://segmentfault.com/img/bVP6mZ?w=1232&h=703); ...
TensorFlow是一個(gè)強(qiáng)大的開源機(jī)器學(xué)習(xí)框架,它的設(shè)計(jì)目的是使構(gòu)建、訓(xùn)練和部署深度神經(jīng)網(wǎng)絡(luò)變得更加容易。在TensorFlow中,測(cè)試代碼是非常重要的一部分,因?yàn)樗梢詭椭_保代碼的正確性,并且在進(jìn)行修改或添加新功能時(shí),測(cè)試代碼可以保證您的代碼沒有破壞原來的功能。 在本文中,我們將介紹如何編寫和運(yùn)行TensorFlow測(cè)試代碼。 1. 使用pytest進(jìn)行測(cè)試 pytest是一個(gè)Pyt...
摘要:或者輸入調(diào)用模塊模塊也就是源文件進(jìn)入交互命令模式參數(shù)傳遞命令行的參數(shù)會(huì)賦值給模塊的變量。操作符是向下取數(shù),小數(shù)位為。每一個(gè)腳本文件稱之為一個(gè)模塊。 Python是比較熱的語言,個(gè)人興趣參考官方文檔:https://docs.python.org/2/tut...邊看邊翻譯了一下(后面會(huì)持續(xù)更新),有興趣的可以看看。 Python具有高級(jí)的數(shù)據(jù)結(jié)構(gòu),能高效地面向?qū)ο缶幊獭K膬?yōu)雅的語法、...
閱讀 1331·2019-08-30 15:44
閱讀 1381·2019-08-29 18:42
閱讀 433·2019-08-29 13:59
閱讀 770·2019-08-28 17:58
閱讀 2811·2019-08-26 12:02
閱讀 2414·2019-08-23 18:40
閱讀 2406·2019-08-23 18:13
閱讀 3106·2019-08-23 16:27