元程式設計的概念來自lisp和smalltalk。
用來生成**的程式稱為元程式metaprogram,編寫這種程式就稱為元程式設計metaprogramming。
python主要通過反射來實現元程式設計。
python中type構建類所有非object類都繼承自object類
所有類的型別包括type類都是type
type類繼承自object類,object類的型別也是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 工...