看完必會元程式設計

2021-08-31 21:27:21 字數 4115 閱讀 4647

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

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

python主要通過反射來實現元程式設計。

python中

所有非object類都繼承自object類

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

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

type構建類
class

type

(object):

def__init__

(cls, what, bases=

none

,dict

=none):

# known special case of type.__init__

""" type(object_or_name, bases, dict)

type(object) -> the object's type

type(name, bases, dict) -> a new type

# (copied from class doc)

"""pass

構建

def

__init__

(self)

: self.x =

1000

defshow

(self)

:return self.__dict__

xclass =

type

('myclass',(

object,)

,)# 字典是類屬性 print(xclass)

print

(xclass)

print

(xclass.__name__)

print

(xclass.__dict__)

print

(xclass.mro())

xclass(

).show(

)

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

構建元類

乙個類可以繼承自type類

class

modelmeta

(type):

def__new__

(cls,

*args)

:print

(cls)

print

(*args)

return

super()

.__new__(cls,

*args)

繼承自type,modelmeta就是元類,它可以建立出其他類。

class

modelmeta

(type):

# 繼承自type

def__new__

(cls, name, bases, attrs:

dict):

print

(cls)

print

(name)

print

(bases)

print

(attrs)

print

("--------"

)return

super()

.__new__(cls, name, bases, attrs)

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

class

a(metaclass=modelmeta):id

=100

def__init__

(self)

: self.x =

2000

# 第二種 b繼承自a後,依然是從modelmeta的型別

class

b(a)

:# 繼承

pass

# 第三種 元類就可以使用下面的方式建立新的類

c = modelmeta(

'class',(

),)print

(type

(a))

print

(type

(b))

print

(type

(c))

從執行結果還可以分析出__new__(cls, *args)的引數結構

中間是乙個元組('a', (), )

對應 (name, bases, dict)

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

class

field

:def

__init__

(self, fieldname=

none

, pk=

false

, nullable=

false):

self.fieldname = fieldname

self.pk = pk

self.nullable = nullable

def__repr__

(self)

:return"".

format

(self.fieldname)

class

modelmeta

(type):

# 繼承自type

def__new__

(cls, name, bases, attrs:

dict):

print

(cls)

print

(name)

print

(bases)

print

(attrs,

'-------------'

)# 使用元類動態注入表名

tblname =

'__tablename__'

if tblname not

in attrs.keys():

attrs[tblname]

= name

primarykeys =

for k, v in attrs.items():

ifisinstance

(v, field)

:print

(k)print

(v)print

(v.fieldname)

if v.fieldname is

none

: v.fieldname = k # 沒有名字則使用屬性名

if v.pk:

attrs[

'__primarykeys__'

]= primarykeys

return

super()

.__new__(cls, name, bases, attrs)

class

modelbase

(metaclass=modelmeta)

:pass

class

student

(modelbase):id

= field(pk=

true

, nullable=

false

) name = field(

'username'

, nullable=

false

) age = field(

)print

('----------------'

)print

(student.__dict__)

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

構造好元類,就可以在類定義時,使用關鍵字引數metaclass指定元類,可以使用最原始的metatype(name,

bases, dict)的方式構造乙個類。

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

元程式設計一般用於框架開發中。

看完必會的漢諾塔以及遞迴理解

長篇警告 全部都是在學習過程中自己的理解,若其中有誤請及時提出,以便修改 遞迴是我們學習過程中必不可少的一部分,很多剛入門的同學無法理解遞迴的含義,或者只是知道這是一種自己呼叫自己的函式,但是並不知道原理以及原因。在遞迴呼叫中,有直接呼叫自己和間接呼叫自己。無論是直接還是間接都是相同的,沒有什麼差別...

看完《objective c 程式設計之道》有感

花了兩個小時看了一遍 objective c 程式設計之道 總結如下 1 我腦子抽筋了,門面模式和中介者模式差別這麼明顯我一開始能混淆了 2 單例模式很不一樣,跟語言機制有關,特別是記憶體分配的機制。而且oc需要單例時clone返回自己 3 裝飾模式oc多了一種方式用category 4 享元模式對...

程式設計必會單詞v1

程式設計必會單詞v1 exception 異常 bound 邊界 out of bounds 越界 index 索引 amount 總量 serialize 序列化 deserialize 反序列化 serializable 可序列化的 general 通常的 exist 存在的 project 工...