摘要:概要本文僅僅是對廖雪峰老師的使用元類自定義進行改進,并不是要創建一個框架編寫,刪除了參數,參數全部為定義字段類型相關參數,和眾多有名的相同,使用反射,方便字段的擴展,如本例使用就是反射的應用字段類型字段長度字段默認值,如果想擴展可以填寫更多
概要
本文僅僅是對廖雪峰老師的使用元類自定義ORM進行改進,并不是要創建一個ORM框架
編寫field
class Field(object): def __init__(self, column_type,max_length,**kwargs): """ 1,刪除了參數name,field參數全部為定義字段類型相關參數,和眾多有名的orm相同 2,使用反射,方便字段的擴展,如本例使用deafault就是反射的應用 """ self.column_type = column_type #字段類型 self.max_length=max_length #字段長度 self.default=None #字段默認值,如果想擴展可以填寫更多的參數 if kwargs: for k,v in kwargs.items(): if hasattr(self,k): setattr(self,k,v) def __str__(self): return "<%s>" % (self.__class__.__name__) class StringField(Field): def __init__(self,max_length,**kwargs): super().__init__(column_type="varchar({})".format(max_length),max_length=max_length,**kwargs) class IntegerField(Field): def __init__(self,**kwargs): super().__init__(column_type="bigint",max_length=8)
編寫metaclass
class ModelMetaclass(type): def __new__(cls, name, bases, attrs): if name=="Model": return type.__new__(cls, name, bases, attrs) mappings = dict() for k, v in attrs.items(): #print("k={},v={}".format(k,v)) if isinstance(v, Field): mappings[k] = v for k in mappings.keys(): attrs.pop(k) attrs["__mappings__"] = mappings # 保存屬性和列的映射關系 attrs["__table__"] = attrs.get("Meta").table or name # 假設表名和類名一致 return type.__new__(cls, name, bases, attrs)
編寫model
class Model(dict, metaclass=ModelMetaclass): def __init__(self, **kw): super(Model, self).__init__(**kw) def __getattr__(self, key): try: return self[key] except KeyError: raise AttributeError(r""Model" object has no attribute "%s"" % key) def __setattr__(self, key, value): self[key] = value def save(self): fields = [] params = [] for k, v in self.__mappings__.items(): fields.append(k) params.append(getattr(self, k,v.default)) sql = "insert into {} ({}) values ({})".format(self.__table__, self.join(fields) ,self.join(params)) print("SQL: %s" % sql) #自己寫了一個join函數,廖雪峰老師使用自帶join,無法處理數字等非字符串類型 import functools def join(self,attrs,pattern=","): return functools.reduce(lambda x,y:"{}{}{}".format(x,pattern,y),attrs)
測試
class User(Model): #使用Meta,能自定義表的相關信息 class Meta: #自定義表名 table="users" # 定義類的屬性到列的映射: id = IntegerField() name = StringField(max_length=50) email = StringField(max_length=50,default="root@123.com") password = StringField(max_length=50) if __name__=="__main__": # 創建一個實例: u=User(id=234,name="jane",password="pwd") # 保存到數據庫: u.save() #打印結果;SQL: insert into users (id,name,email,password) values (234,jane,root@123.com,pwd)
引用
1, 廖雪峰:使用元類
2, github:本文源碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44597.html
摘要:同時,在元類中,我們還需要加上一個判斷,只有在這個類創建時才需要控制其類的生成,其他的就不需要了。完整代碼后臺回復元類獲取原創不易,如果文章對你有用的話,點贊留言轉發是對我的最大支持日常學代碼不止,還有美和樂趣 我之前在深入理解python中的類和對象中說過,python中的類也是一個對象,可以說是類對象,可以由type來創建類對象的。有了這個知識我們先看看下面這個函數: showIm...
摘要:兩句話掌握最難知識點元類千萬不要被所謂元類是的程序員不會用到的特性這類的說辭嚇住。元類道生一,一生二一般來說,元類均被命名后綴為。這是的一大難點,但學完了元類,一切變得清晰。 兩句話掌握python最難知識點——元類 千萬不要被所謂元類是99%的python程序員不會用到的特性這類的說辭嚇住。因為每個中國人,都是天生的元類使用者 學懂元類,你只需要知道兩句話: 道生一,一生二,二生三...
摘要:但一般情況下,我們使用類作為元類。那么,元類到底有什么用呢要你何用元類的主要目的是為了控制類的創建行為。當然,有很多種做法,這里展示用元類的做法。當你創建類時,解釋器會調用元類來生成它,定義一個繼承自的普通類意味著調用來創建它。 元類 Python 中的元類(metaclass)是一個深度魔法,平時我們可能比較少接觸到元類,本文將通過一些簡單的例子來理解這個魔法。 類也是對象 在 Py...
JSON JSON是JavaScript Object Notation的縮寫,它是一種數據交換格式。 道格拉斯·克羅克福特(Douglas Crockford)--雅虎的高級架構師--發明了JSON這種超輕量級的數據交換格式. 序列化 讓我們先把小明這個對象序列化成JSON格式的字符串: var xiaoming = { name: 小明, age: 14, gender...
摘要:根節點已經自動綁定為全局變量。如果寫入的字符串是通過網絡拿到了,要注意對字符編碼來避免攻擊。修改也是經常需要的操作。當你遍歷一個父節點的子節點并進行刪除操作時,要注意,屬性是一個只讀屬性,并且它在子節點變化時會實時更新。 1.操作DOM 操作一個DOM節點實際上就是這么幾個操作:更新、遍歷、添加、刪除。 由于ID在HTML文檔中是唯一的,所以document.getElementByI...
閱讀 2892·2021-11-24 09:38
閱讀 3515·2021-11-23 09:51
閱讀 980·2021-09-09 11:52
閱讀 4036·2021-08-11 11:18
閱讀 1115·2019-08-30 14:05
閱讀 3234·2019-08-30 11:23
閱讀 1771·2019-08-29 17:02
閱讀 1130·2019-08-26 13:49