python元程式設計 Python 元程式設計

2021-10-11 12:59:45 字數 4854 閱讀 5606

1、元程式設計:

元程式設計 概念來自 lisp 和 smalltalk

我們寫程式 是直接寫**,是否能夠用**來生成未來我們需要的**,這就是元程式設計。

用阿里生成**的程式稱為元程式,metaprogram,編寫這種程式就稱為元程式設計。

python 語言能夠通過反射實現 元程式設計

python 中;

所有非object 類都繼承自object 類

所有類的型別包括 type類 都是type

type類 繼承自object 類,object類的型別也是type類

2、type類

type構建類:

1 classtype(object):2 """

3 type(object_or_name, bases, dict)4 type(object) -> the object's type ----> 返回物件的型別,例如 type(10)5 type(name, bases, dict) -> a new type ----> 返回乙個新的型別6 """

測試:1 xclass = type('mycalss', (object,), )2

3 print(xclass)4 print(xclass.__dict__)5 print(xclass.__name__)6 print(xclass.__bases__)7 print(xclass.mro())

結果:mycalss

mycalss 是建立類的 識別符號

(objects,): 基類

類似命名元組

測試:1 def __init__(self):2 self.x = 100

4 defshow(self):5 print(self.__dict__)6 print(self.x)7

8 xclass = type('myclass', (object,), )9

10 print(xclass)11 print(xclass.__name__)12 print(xclass.__dict__)13 print(xclass.mro())14

15 print('-' * 40)16 xclass().show()

結果:1

2 myclass3 4 [, ]5 ----------------------------------------

6 7 100

可以借助type 構造 任何類,用**來生成**,這就是元 程式設計

3、構造元類:

乙個類可以繼承自type 類,注意不是繼承自 object 類了。

1 classmodelmeta(type):2 def __new__(cls, *args, **kwargs):3 print(cls)4 print(args) #就是 type(name,bases, dict)的引數

5 print(kwargs)6 print('------------------------------')7 return super().__new__(cls, *args, **kwargs)8 #此處的 modelmeta 就是元類,繼承自type,它可以建立出其他類

10 #第一種 使用metaclass 關鍵字 引數指定元類

11 class a(metaclass=modelmeta):12 id = 100

14 def __init__(self):15 print('==== a ====')16 print(a.__class__)17 print(a.mro())18 print('~~~~~~~~~~~~~~====~~~~~~~~~~')19 #第二種 b繼承自 a 後,依然是從modelmeata的型別

20 classb(a):21 def __init__(self):22 print('==== b ====')23

24 print(b.__class__)25 print(b.mro())26 print('~~~~~~~~~~~~====~~~~~~~~~~~~')27 #第三種 元類就可以使用下面的方式建立新的類

28 c = modelmeta('c', (), {})29 print(c.__class__)30 print(c.mro())31 print('~~~~~~~~~~~~====~~~~~~~~~~~~')32

33 #d,e 是type的 例項, 沒有使用自定義的元類,所以預設使用type

34 class d:pass

35 e = type('e', (), {})36

37 class f(modelmeta):pass #和a 不一樣,沒有使用關鍵字 metaclass

39 print('*************************====')40 print(type(a), a.__bases__)41 print(type(b), b.__bases__)42 print(type(c))43 print(type(d))44 print(type(e))45 print(type(f), f.__bases__)

結果:1 d:\python3.7\python.exe e:/code_pycharm/test_in_class/tt14.py2

3 ('a', (), )4 {}5 ------------------------------

6 7 [, ]8 ~~~~~~~~~~~~~~====~~~~~~~~~~

9 10 ('b', (,), )11 {}12 ------------------------------

13 14 [, , ]15 ~~~~~~~~~~~~====~~~~~~~~~~~~

16 17 ('c', (), {})18 {}19 ------------------------------

20 21 [, ]22 ~~~~~~~~~~~~====~~~~~~~~~~~~

23 *************************====

24 (,)25 (,)26

27 28

29 (,)30

31 process finished with exit code 0

修改**如下:

1 classmodelmeta(type):2 def __new__(cls, name, bases, dict):3 print(cls)4 print(name)5 print(dict)6 print('------------------------------')7 return super().__new__(cls, name, bases, dict)8 #此處的 modelmeta 就是元類,繼承自type,它可以建立出其他類

10 #第一種 使用metaclass 關鍵字 引數指定元類

11 class a(metaclass=modelmeta):12 id = 100

14 def __init__(self):15 print('==== a ====')

從結果看出,只要元類是modelmeta,建立類物件時,就會呼叫moelmeta的 __new__方法

元類的應用:

模擬建立**式

1 class field:#定義欄位的屬性類

2 def __init__(self, fieldname=none,pk=false, nullable=true):3 self.fieldname=fieldname4 self.pk =pk5 self.nullable =nullable6

7 def __repr__(self):8 return '

10 classmodelmeta(type):11 def __new__(cls, name, bases, attrs:dict):12 print(cls)13 print(name)14 print(bases)15 print('*****', attrs,'*****')16

17 if '__tablename__' not inattrs.keys():18 attrs['__tablename__'] =name19

29 return super().__new__(cls, name, bases, attrs)30

31 class modelbase(metaclass=modelmeta):32 '''從 modelbases 繼承的類的型別都是modelmeta'''

33 pass

35 classstudents(modelbase):36 id = field(pk=true, nullable =false)37 name = field('username', nullable=false)38 age =field()39

40 print('***********************************=')41 print(students.__dict__)

結果:1 d:\python3.7\python.exe e:/code_pycharm/test_in_class/tt14.py2

3 modelbase4 ()5 ***** *****

6 7 students8 (,)9 ***** {'__module__': '__main__', '__qualname__': 'students', 'id':

10 ***********************************=

11 {'__module__': '__main__', 'id':

13 process finished with exit code 0

view code

元程式設計總結:

元類是製造類的工廠,是生成類的類

構造好元類,就可以在類定義的時候,使用關鍵字引數 metaclass 指定元類,可以使用最原始的metatype(name,base,dict)的方式 構造乙個類

元類的__new__()方法中,可以獲取元類的資訊,當前類,基類,類屬性字典

元程式設計一般用於框架開發中,django sqlalchemy 都使用了 元類。

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...

python元類程式設計

當我們希望動態的產生類的時候,就需要用到元類程式設計的手段。要掌握此技術,需要明白以下幾個基本內容 metaclass type new call 在python 中,所有東西都是物件 object 包括python的類 class 也是乙個物件。檢視乙個物件的類,可以用物件的 class 屬性 c...