Python 常數設計方法
Python Class 的取值與賦值
Python 中屬性取值與賦值各有兩種語法:
dot style : 也就是藉由 classA.attrA 來與值與賦值
dict style: 則是 classA['attrA'] 來與值與賦值無論採用哪一種方法,instance 的屬性值都會放在 self.dict 之內。
Python 屬性值存取
屬性值存取
class Auditor():
# via dot to get
def __getattr__(self, item):
return self.__dict__[item]
def __setattr__(self, key, value):
self.__dict__[key] = value
# via [] to get
def __getitem__(self, item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
s = Auditor()
s.age = 10 # __setattr__ via set
print(s.age) # __getattr__
# 10
s['age'] = 20 # __setitem__ via []
print(s['age']) # __getitem__
print(s.name) # __getattr__
# KeyError: 'name'
# 尚未賦值變取值會拋出 KeyError
常數類別設計方法
在了解 Python 屬性值存取方式後,可以藉由關閉屬性編輯的方式來達到建立常數的目的。
也就是建立一個僅有 getter 卻沒有 setter 的屬性。Python 基本上並沒有 const 之類的關鍵字供使用者建立常數。
但我們可以將相關的常數整理在一個類別中,僅允許存取但限制修改。
來達到常數的建立與管理。
常數類別設計方法
class Constant(object):
def __setattr__(self, key, value):
raise Exception(key + ": Constants should not be changed")
# constant.PI/constant.EULER 會拋出 Exception
def __init__(self):
pass
PI = 3.1415926535
EULER = 0.5772156649
const = Constant()
print(const.PI)
# 3.1415926535
const.PI = "another"
# Exception: PI : Constants should not be changed
# const['X'] =123
# __setitem__ 未定義所以拋出
# TypeError: 'constant' object does not support item assignment
static method 來設計常數
class Math:
@staticmethod
def getPI():
return 3.14159
其他
- 關於上面 __setattr__ function 有看到部份的人以不同的方式撰寫 (Python3+)。
- 函式的 parameters 寫法不同。 *_
- 因為單純要禁止資料設定,所以直接以解包語法簡化程式碼(overloaded)。
- 可參考 Python Unpacking/解包或開箱
另一種方法 *_
# 下方寫法意味著 VarArgs signature,無論傳幾個 args 都會導向此函數。
def __setattr__(self, *_):
pass