Python程式設計:metaclass元類實現簡單的ORM
ORM全稱“Object Relational Mapping”,即物件-關係對映
把關係資料庫的一行對映為一個物件,一個類對應一個表
這樣,寫程式碼更簡單,不用直接操作SQL語句。
# -*- coding: utf-8 -*-
# @File : 元類例項ORM.py
# @Date : 2018-06-01
# @Author : Peng Shiyu
# 先定義metaclass,就可以建立類,最後建立例項
class Field(object):
"""儲存資料庫表的欄位名和欄位型別"""
def __init__(self, name, column_type) :
self.name = name
self.column_type = column_type
def __str__(self):
return "<%s %s %s>"%(self.__class__.__name__, self.name, self.column_type)
# 定義各種型別
class IntegerField(Field):
def __init__(self, name):
super(IntegerField, self).__init__(name, "int" )
class StringField(Field):
def __init__(self, name):
super(StringField, self).__init__(name, "varchar(255)")
# 編寫元類
"""
排除掉對Model類的修改;
在當前類(比如User)中查詢定義的類的所有屬性,如果找到一個Field屬性,就把它儲存到一個__mappings__的dict中,
同時從類屬性中刪除該Field屬性,否則,容易造成執行時錯誤(例項的屬性會遮蓋類的同名屬性);
把表名儲存到__table__中,這裡簡化為表名預設為類名。
"""
class ModelMetaclass(type):
def __new__(cls, name, bases, attrs):
if name == "Model":
return type.__new__(cls, name, bases, attrs)
print("Fond Model: %s"% name)
# 查詢Field欄位
mappings = {}
for k, v in attrs.items():
if isinstance(v, Field):
print("Fond Field: %s => %s"% (k, v))
mappings[k] = v
# 彈出Field欄位
for k in mappings.keys():
attrs.pop(k)
attrs["__mappings__"] = mappings # 儲存屬性和列的對映關係
attrs["__table__"] = name # 假設表名和類名一致
return type.__new__(cls, name, bases, attrs)
# 在Model類中,就可以定義各種操作資料庫的方法,比如save(),delete(),find(),update等等
class Model(dict, metaclass=ModelMetaclass):
def __init__(self, **kwargs):
super(Model, self).__init__(**kwargs)
def __getattr__(self, key):
return self[key]
def __setattr__(self, key, value):
self[key] = value
def save(self):
fields = []
params = []
args = []
for k, v in self.__mappings__.items():
fields.append(v.name)
params.append("?")
args.append(getattr(self, k, None))
sql = "insert into %s (%s) VALUES (%s)"% (self.__table__, ",".join(fields), ",".join(params))
print("sql: %s"% sql)
print("args: %s"% args)
class User(Model):
# 定義類的屬性到列的對映:
id = IntegerField("id")
name = StringField("name")
email = StringField("email")
password = StringField("password")
if __name__ == '__main__':
# # 建立一個例項
user = User(id=1, name="Tom", email="[email protected]", password="123456")
# 儲存到資料庫
user.save()
# 訪問元素
print(user.name)
print(user["name"])
user.name = "jack"
print(user.name)
"""
Fond Model: User
Fond Field: id => <IntegerField id int>
Fond Field: name => <StringField name varchar(255)>
Fond Field: email => <StringField email varchar(255)>
Fond Field: password => <StringField password varchar(255)>
sql: insert into User (id,name,email,password) VALUES (?,?,?,?)
args: [1, 'Tom', '[email protected]', '123456']
Tom
Tom
jack
"""
相關推薦
Python程式設計:metaclass元類實現簡單的ORM
ORM全稱“Object Relational Mapping”,即物件-關係對映 把關係資料庫的一行對映為一個物件,一個類對應一個表 這樣,寫程式碼更簡單,不用直接操作SQL語句。 # -*- coding: utf-8 -*- # @File
python——type()、metaclass元類和精簡ORM框架
定制 定義 attribute varchar elm cep 實例 編寫代碼 __main__ 1、type()函數 #type()函數既可以返回一個對象的類型,又可以創建出新的類型, # 比如,我們可以通過type()函數創建出Hello類,而無需通過cl
Python程式設計:aiohttp庫伺服器端簡單使用
通過flask和aiohttp對比著來看 flask from flask import Flask app = Flask(__name__) @app.route("/") de
Python元類實戰,通過元類實現資料庫ORM框架
本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是Python專題的第19篇文章,我們一起來用元類實現一個簡易的ORM資料庫框架。 本文主要是受到了廖雪峰老師Python3入門教程的啟發,不過廖老師的部落格有些精簡,一些小白可能看起來比較吃力。我在他的基礎上做了一些補充和註釋
python 元類的簡單解釋
.html www ren 有用 copy tle 例子 sky -i 本文轉自博客:http://www.cnblogs.com/piperck/p/5840443.html 作者:piperck python 類和元類(metaclass)的理解和簡單運用 (一) p
12.python-metaclass元類
*args bject tro 接收 自定義 all metaclass 控制 module 1.python中一切皆是對象,類本身也是一個對象,當使用關鍵字class的時候,python解釋器在加載class的時候會創建一個對象(這裏的對象指的是類而非類的實例) cla
python程式設計:從入門到實踐學習筆記-類
面向物件程式設計時,都會遇到一個概念,類,python也有這個概念,下面我們通過程式碼來深入瞭解下。 建立和使用類 class Dog(): def __init__(self, name, age):  
Python程式設計:使用sys、argparse、click、fire實現命令列解析
python實現指令碼命令列的庫有: 內建庫sys 內建庫argparse 第三方庫click 第三方庫fire 內建庫sys sys.argv 包含命令列引數列表,第一個引數是檔名 sys_demo.py import sys d
python3:通過例項講解元類實現_ORM01
ORM全稱“Object Relational Mapping”,即物件-關係對映,就是把關係資料庫的一行對映為一個物件,也就是一個類對應一個表,這樣,寫程式碼更簡單,不用直接操作SQL語句。 明確下我們的需求: 我們要建立一個類,並把類對映到資料庫的一張表,並校驗資料庫每個欄位的取
使用python 元類實現ORM關係對映
元類實現ORM 1. ORM是什麼 ORM 是 python程式語言後端web框架 Django的核心思想,“Object Relational Mapping”,即物件-關係對映,簡稱ORM。 一個句話理解就是:建立一個例項物件,用建立它的類名當做資料表名,用建立它的類屬性對應資料表的
Python程式設計:zope.interface實現介面
pypi : https://pypi.org/project/zope.interface/ 文件:https://zopeinterface.readthedocs.io/en/latest/index.html 面向物件中介面負責定義規則,具體實現類來實現規則 安裝 p
《Python程式設計:從入門到實踐》第9章-類 習題
文章目錄 9-1 餐館 9-2 三家餐館 9-3使用者 9-4 就餐人數 9-5 嘗試登入次數 9-6冰淇淋小店 9-7 管理員 9-8 許可權 9-9 電瓶升級 9-10 匯入Resta
《Python程式設計:從入門到實踐》第2章 變數和簡單資料型別
第2章 變數和簡單資料型別 2-3 個性化的訊息 將使用者的姓名存到一個變數中,並向該使用者顯示一條訊息。顯示的訊息應非常簡單,如“Hello Eric, would you like to lear
Python程式設計:用兩個棧實現佇列
用兩個棧實現佇列思路: 入隊進入一個棧,從另一棧出隊 外加一個元素傳遞的方法,負責將元素從入隊棧轉移到出隊棧 入隊棧:1,2,3 出隊棧:3,2,1 # 先實現一個棧 class Stack():
《Python程式設計:從入門到實踐》第9章 類
第9章 類 9-1 餐館 建立一個名為Restaurant 的類,其方法__init__() 設定兩個屬性:restaurant_name 和cuisine_type 。建立一個名為describe_
通過 python的 __call__ 函式與元類 實現單例模式
簡單一句話,當一個類實現__call__方法時,這個類的例項就會變成可呼叫物件。 直接上測試程式碼 class ClassA: def __call__(self, *args, **kwargs): print('call ClassA i
《Python程式設計:從入門到實踐》第九章:類
第九章 類 面向物件程式設計;你定義一大類物件都有的通用行為。基於類建立物件時,每個物件都自動具備這種通用行為,然後可根據需要賦予每個物件獨特的個性。 根據類來建立物件被稱為例項化。你將指定可在例項中儲存什麼資訊,定義可對這些例項執行哪些操作。你還將編寫一些類
C#中使用SerialPort類實現簡單串列埠程式設計
由於專案需要通過串列埠通訊,所以學習一下在此做一下筆記。 .NET 2.0提供了串列埠通訊的功能,其名稱空間是System.IO.Ports。這個新的框架不但可以訪問計算機上的串列埠,還可以和串列埠裝置進行通訊。 建立C#串列埠通訊程式之建立SerialPort 物件 通
Python程式設計:urlsplit, urlparse簡單區別
顧名思義,urlsplit是拆分,而urlparse是解析,所以urlparse粒度更為細緻 區別 split函式在分割的時候,path和params屬性是在一起的 程式碼示例 # -*- coding: utf-8 -*- from urllib.parse import
Python程式設計:namedtuple命名元組和dict字典相互轉換
from collections import namedtuple dct = { "name": "Tom", "age": 24 } Person = namedtuple("