摘要:因為種種原因,并未提供如一樣的修飾符,換言之,中沒有常量,至少截止年年末,還沒有這個打算。其實可以曲線救國實現常量。其函數原型為其中為變量名,為變量值。而則以的形式保存了內所有可寫的屬性,為變量名,為變量值。
因為種種原因,Python并未提供如C/C++/Java一樣的const修飾符,換言之,python中沒有常量,至少截止2015年年末,還沒有這個打算。Python程序一般通過約定俗成的變量名全大寫的形式來表示這是一個常量,但是這終究不是長久之計。
其實Python可以曲線救國實現常量。
在Python的面向對象中,object.__setattr__()這個built-in function在對類的屬性賦值的時候會自動調用。其函數原型為:
object.__setattr__(self, name, value)
其中name為變量名,value為變量值。
而object.__dict__則以dict的形式保存了object內所有可寫的屬性,key為變量名,value為變量值。
那么我們就有可能通過建立一個const類,對其object.__setattr__()方法進行overwrite,在對屬性值進行賦值的時候判斷,如果屬性存在,則表示這是對常量的重賦值操作,從而拋出異常,如果屬性不存在,則表示是新聲明了一個常量,可以進行賦值操作。
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行是上述思路的類的一個實現。
第12-14行的寫法值得說明。我們盡管擁有了_const類,但是我們當前使用這個類仍然需要
import const c = const._const() c.TEST_CONSTANT = "test"
這樣的形式來聲明一個常量TEST_CONSTANT,然而我們希望用更簡潔的方法進行常量的賦值。形如:
import const const.TEST_CONSTANT = "test"
在python中,__name__內置屬性是當前的class或者type的值。通俗地講,__name__的值有以下兩種形式:
如果運行某一個py文件,在該文件中,__name__的值為"__main__"
如果import了某一個py文件,那么在該import的文件中,__name__的值為該文件的文件名(不帶.py后綴)
而sys.modules是一個dict對象,包括了當前上下文中python已經load的所有模塊的信息,dict的key為文件名,value為模塊對象。
在const.py 中,14行的寫法等價于
import const sys.modules["const"] = _const()
即,讓_const類作為模塊的入口點,引入const.py等價于聲明了一個_const類的實例。
至此python的常量實現完畢,使用test.py測試:
# -*- 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!
成功為兩常量賦值,在試圖修改第一個常量值時拋出異常:)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37655.html
摘要:本文原文是在開始之前,我要聲明我們要解釋的是技巧。不是最佳實踐,并且在至少一種情況下,它是不可取的。技巧這些技巧使得我的包管理更容易一點。我很確定我的一些讀者使用這個技巧會有一個嚴重的問題。盡管如此,因為這些技巧,我喜歡讓事情簡單明了。 本文原文是 setup.py tricks showImg(http://pydanny.com/static/setup.png); 在...
摘要:序列化的這種過程,我們將其稱為腌制。而把模塊編譯成二進制語言程序的這個過程叫做字節編譯,這個過程會產生一個與編譯的模塊對應的文件。 常量: 在Python中常量的使用并不像java等其他編程語言一樣有特定的常量實現的關鍵字,在Python中定義需要用對象的方法來創建。 showImg(https://segmentfault.com/img/bVP6mZ?w=1232&h=703); ...
摘要:序列化的這種過程,我們將其稱為腌制。而把模塊編譯成二進制語言程序的這個過程叫做字節編譯,這個過程會產生一個與編譯的模塊對應的文件。 常量: 在Python中常量的使用并不像java等其他編程語言一樣有特定的常量實現的關鍵字,在Python中定義需要用對象的方法來創建。 showImg(https://segmentfault.com/img/bVP6mZ?w=1232&h=703); ...
TensorFlow是一個強大的開源機器學習框架,它的設計目的是使構建、訓練和部署深度神經網絡變得更加容易。在TensorFlow中,測試代碼是非常重要的一部分,因為它可以幫助您確保代碼的正確性,并且在進行修改或添加新功能時,測試代碼可以保證您的代碼沒有破壞原來的功能。 在本文中,我們將介紹如何編寫和運行TensorFlow測試代碼。 1. 使用pytest進行測試 pytest是一個Pyt...
摘要:或者輸入調用模塊模塊也就是源文件進入交互命令模式參數傳遞命令行的參數會賦值給模塊的變量。操作符是向下取數,小數位為。每一個腳本文件稱之為一個模塊。 Python是比較熱的語言,個人興趣參考官方文檔:https://docs.python.org/2/tut...邊看邊翻譯了一下(后面會持續更新),有興趣的可以看看。 Python具有高級的數據結構,能高效地面向對象編程。它的優雅的語法、...
閱讀 1337·2019-08-30 15:44
閱讀 1388·2019-08-29 18:42
閱讀 443·2019-08-29 13:59
閱讀 779·2019-08-28 17:58
閱讀 2822·2019-08-26 12:02
閱讀 2423·2019-08-23 18:40
閱讀 2411·2019-08-23 18:13
閱讀 3114·2019-08-23 16:27