python元程式設計就是使用metaclass技術進行程式設計,99%的情況下不會使用,了解即可。
對於學習python和使用python的同學,你是否好奇過python中的物件究竟是怎麼被建立處理的?你是否知道python的class也是物件?是的,你沒看錯,class也是object。既然class也是objet,那麼class這個object是誰建立處理的?不糾結,直接給出答案,是有type()建立的。可以很概括的說:python中類和物件的起源就是type()方法。
讓我們來捋一下流程:type建立class,class建立object;class即是class也是obejct,是的,就是這樣。
metaclass就是type自己或是其子類。不同的類可以指定不同的metaclass,從而實現動態修改類的目的。(動態的修改類不一定要用metaclass,裝飾器同樣可以解決)
要求:使用方法的形式,將乙個類的自定義屬性變成首字元大寫,其餘小寫。
defupper_attr(class_name, class_parents, class_attr):
uppercase_attr ={}
for attr_name, attr_value in
class_attr.items():
if attr_name.startswith('__'
): uppercase_attr[attr_name] =attr_value
else
: uppercase_attr[attr_name.capitalize()] =attr_value
return
type(class_name, class_parents, uppercase_attr)
class test(metaclass =upper_attr):
data = '
abc'
print(hasattr(test(), '
data'))
print(hasattr(test(), '
data'))
print(test.data)
要求:使用類的形式,將乙個類的自定義屬性變成首字元大寫,其餘小寫。
classupperattrmetaclass(type):
def__new__
(cls, cls_name, bases, attr_dict):
uppercase_attr ={}
for name, val in
attr_dict.items():
if name.startswith('__'
): uppercase_attr[name] =val
else
: uppercase_attr[name.capitalize()] =val
return super().__new__
(cls, cls_name, bases, uppercase_attr)
class test(metaclass =upperattrmetaclass):
data = '
abc'
print(hasattr(test(), '
data'))
print(hasattr(test(), '
data'))
print(test.data)
python元程式設計 Python 元程式設計
1 元程式設計 元程式設計 概念來自 lisp 和 smalltalk 我們寫程式 是直接寫 是否能夠用 來生成未來我們需要的 這就是元程式設計。用阿里生成 的程式稱為元程式,metaprogram,編寫這種程式就稱為元程式設計。python 語言能夠通過反射實現 元程式設計 python 中 所有...
python 元類程式設計
裝飾器任何時候你定義裝飾器的時候,都應該使用 functools 庫中的 wraps 裝飾器來註解底層包裝函式.因為乙個普通裝飾器作用在某個函式上時,這個函式的重要的元資訊比如名字 文件字串 註解和引數簽名都會丟失。但是 wraps不會。import time from functools impo...
python 元類程式設計
getattr 方法可用來檢查乙個類中是否有乙個屬性,比如 class user def init self,name self.name name def getattr self,item print not find attr def main user user dog user.age i...