跳至主要内容

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

Static Functions: 工具函數寫法