python 類
相信大家應該瞭解過類,類對象,和類實例的區別,我的一點點發現:
當類作爲模塊被調用,會自動實例化。
這是被調用模塊
class const():
def __setattr__(self,name,value):
if name in self.__dict__:
raise TypeError("常量不能改變")
elif not name.isupper():
raise TypeError("常量必須全大寫組成")
else:
self.__dict__[name] = value
c = 1 #用於測試 sys.modules[__name__] = const()
import sys
sys.modules[__name__] = const()
調用模塊
import Untitled
# c = Untitled.const()
#x = Untitled.c
Untitled.NAME = "fic"
print(Untitled.NAME)
try:
Untitled.NAME = "cai"
except TypeError as err:
print(err)
不難發現,在原函數中需要實例化後才能觸發__setattr__函數,被調用後可以直接使用無需實例化
main
其實整個練習最讓我百思不得其解的是
import sys
sys.modules[__name__] = const()
這段是有什麼用
我試着註釋掉,發現調用模塊的函數不會觸發__setattr__函數,只是生成了類對象的變量。
查閱數篇文章後,發現
爲什麼有些代碼塊,要加 if name == main
這是因爲不希望被引入的模塊被運行,正在運行的函數,name__會自動變爲__main,被調用的模塊 name 爲模塊名
=const()
是讓此模塊的功能就是const()類
我想就是這句話使得不實例化仍可以觸發__setattr__函數的原因,雖然不知道爲什麼