中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Python描述器實現ORM模型

發布時間:2022-02-14 13:40:42 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“怎么使用Python描述器實現ORM模型”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么使用Python描述器實現ORM模型”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

訪問或者修改描述器對象的屬性時無法觸發__setattr__等方法,只會觸發描述器類內部的__set__,__get__,__delete__方法.

ORM模型:類名對應表名,對象對應的數據行,類屬性對應數據行的各字段,有幾個表字段,就綁定幾個類屬性;往表中增加數據就是創建對象,每創建一個對象,就是增加一行數據記錄。

ORM框架的功能:

1.建立模型類和表之間的對應關系,允許我們通過面向對象的方式操作數據庫。

2.根據設計的模型類生成數據庫中的表格。

3.通過方便的配置就可以進行數據庫的切換。

MySql的常用數據類型:

1.整數:int,bit

2.小數:decimal(decimal表示浮點數,decimal(5,2)表示共計5位數,小數占2位)

3.字符串:varchar(可變長度),char(不可變長度)

4.日期時間:date,time,datetime

5.枚舉類型:enum

模型類案例:

"""
django的ORM模型字段
BooleanField:   布爾字段,True或False
CharField(max_length=最大長度):     字符串,參數max_length表示最大字符個數
IntegerField:   整數
"""
class TestReport(BaseTable):
    class Meat:
        verbose_name = '測試報告'
        db_table = "TestReport"
    report_name = models.CharField(max_length=40, null=False)
    start_at = models.CharField(max_length=40, null=True)
    status = models.BooleanField()
    testRun = models.IntegerField()
    successes = models.IntegerField()
    reports = models.TextField()

1.__set__方法:設置屬性 

"""
只要一個類中出現了:
    __get__(self,instance,owner)
    __set__(self,instance,value)
    __delete__(self,instance)
    __set_name__(self,owner,name)
    中的任意一個方法,這個類就不是一個普通的類了,
    應被稱為:
        描述器類(應用在ORM模型中)
"""
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        print('---set---方法被觸發了')
    def __delete__(self, instance):
        pass
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    m.attr = 666    # 嘗試修改attr屬性
    print(m.attr)  
    # 輸出:
    ---set - --方法被觸發了
    None
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        """
        :param instance: 修改的對象
        :param value: 修改的值
        :return:
        """
        print('---set---方法被觸發了')
        self.value = value
        print(self)      # <__main__.Field object at 0x7fecc01f8a30>
        print(instance)  # <__main__.Model object at 0x7fecc01f8a00>
        print(value)     # 666
    def __delete__(self, instance):
        pass
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    print(m)      # <__main__.Model object at 0x7fecc01f8a00>,與instance相同
    m.attr = 666  # 嘗試修改attr屬性

2.__get__方法:訪問屬性

 """
只要一個類中出現了:
    __get__(self,instance,owner)
    __set__(self,instance,value)
    __delete__(self,instance)
    __set_name__(self,owner,name)
    中的任意一個方法,這個類就不是一個普通的類了,
    應被稱為:
        描述器類(應用在ORM模型中)
"""
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        print('---get---方法被觸發了')
    def __set__(self, instance, value):
        """
        :param instance: 修改的對象
        :param value: 修改的值
        :return:
        """
        print('---set---方法被觸發了')
        self.value = value
    def __delete__(self, instance):
        pass
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    m.attr = 666  # 嘗試修改attr屬性
    print(m.attr)
    # 輸出:
    ---set - --方法被觸發了
    ---get - --方法被觸發了
    None
"""
只要一個類中出現了:
    __get__(self,instance,owner)
    __set__(self,instance,value)
    __delete__(self,instance)
    __set_name__(self,owner,name)
    中的任意一個方法,這個類就不是一個普通的類了,
    應被稱為:
        描述器類(應用在ORM模型中)
"""
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        print('---get---方法被觸發了')
        print(instance)     # <__main__.Model object at 0x7f80b81a09d0>
        print(owner)        # <class '__main__.Model'>
        return self.value
    def __set__(self, instance, value):
        """
        :param instance: 修改的對象
        :param value: 修改的值
        :return:
        """
        print('---set---方法被觸發了')
        self.value = value
    def __delete__(self, instance):
        pass
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    m.attr = 666  # 嘗試修改attr屬性
    print(m.attr)  # 666
    # 輸出:
    ---set - --方法被觸發了
    ---get - --方法被觸發了
    < __main__.Model object at 0x7f80b81a09d0 >
    < class '__main__.Model'>
    666

3.__delete__方法:刪除屬性

"""
只要一個類中出現了:
    __get__(self,instance,owner)
    __set__(self,instance,value)
    __delete__(self,instance)
    __set_name__(self,owner,name)
    中的任意一個方法,這個類就不是一個普通的類了,
    應被稱為:
        描述器類(應用在ORM模型中)
"""
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        """
        :param instance: 修改的對象
        :param value: 修改的值
        :return:
        """
        print('---set---方法被觸發了')
        self.value = value
    def __delete__(self, instance):
        print('---delete---方法被觸發了')
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    m.attr = 666  # 嘗試修改attr屬性
    del m.attr    # ---delete---方法被觸發了
    print(m.attr)  # None
    # 輸出:
    ---set - --方法被觸發了
    ---delete - --方法被觸發了
    666
"""
只要一個類中出現了:
    __get__(self,instance,owner)
    __set__(self,instance,value)
    __delete__(self,instance)
    __set_name__(self,owner,name)
    中的任意一個方法,這個類就不是一個普通的類了,
    應被稱為:
        描述器類(應用在ORM模型中)
"""
class Field(object):
    """
    只要一個類中出現了以下任意一個方法,這個類就是一個描述器類
    """
    def __get__(self, instance, owner):
        print('---get---方法被觸發了')
        print(instance)     # <__main__.Model object at 0x7f80b81a09d0>
        print(owner)        # <class '__main__.Model'>
        return self.value
    def __set__(self, instance, value):
        """
        :param instance: 修改的對象
        :param value: 修改的值
        :return:
        """
        print('---set---方法被觸發了')
        self.value = value
    def __delete__(self, instance):
        print('---delete---方法被觸發了')
        print(instance)     # <__main__.Model object at 0x7ff61806a160>
        self.value = None
class Model(object):
    attr = Field()  # attr是一個描述器對象,修改時無法觸發__setattr__等方法,
                    # 只能觸發描述器類內部的__set__方法
if __name__ == '__main__':
    m = Model()
    m.attr = 666  # 嘗試修改attr屬性
    del m.attr    # ---delete---方法被觸發了
    print(m.attr)  # None
    # 輸出:
    ---set - --方法被觸發了
    ---delete - --方法被觸發了
    < __main__.Model object at 0x7ff61806a160 >
    ---get - --方法被觸發了
    < __main__.Model object at 0x7ff61806a160 >
    <class '__main__.Model'>
    None

 4.描述器實現ORM模型: 

"""
通過描述器實現ORM模型
"""
class CharField(object):
    def __init__(self,max_length=20):
        self.max_length = max_length
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        # 首先判斷是否為空
        if value is not None:
            # 再判斷是否是字符串
            if isinstance(value, str):
                # 再判斷長度是否符合要求
                if len(value) <= self.max_length:
                    self.value = value
                else:
                    raise TypeError('length need less than {}'.format(self.max_length))
            else:
                raise TypeError('need a str')
        else:
            raise TypeError("can not be None")
    def __delete__(self, instance):
        self.value = None
class IntegerField(object):
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        # 首先判斷是否為空
        if value is not None:
            # 再判斷是否是整數int
            if isinstance(value, int):
                self.value = value
            else:
                raise TypeError('need a int')
        else:
            raise TypeError("can not be None")
    def __delete__(self, instance):
        self.value = None
class UserModel(object):
    # 定義用戶信息的模型類
    name = CharField(max_length=20)  # 定義:name只能賦值為字符串
    pwd = CharField(max_length=40)
    age = IntegerField()    # 定義:age只能賦值為整數
if __name__ == '__main__':
    user = UserModel()
    user.name = "春田"
    print(user.name)    # 輸出: 春田
    user.age = 130
    print(user.age)  # 輸出: 130
    user.pwd = 'wsdgdgdrgerdsfs方式范德薩發阿瑟費薩法 sfa fda fsdf sdf  fg'
    print(user.pwd)     # 輸出: TypeError: length need less than 40

讀到這里,這篇“怎么使用Python描述器實現ORM模型”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海安县| 洛宁县| 南陵县| 日土县| 抚松县| 镇原县| 游戏| 义马市| 黑河市| 理塘县| 织金县| 南乐县| 阿勒泰市| 洪雅县| 山阴县| 潍坊市| 长岭县| 三原县| 安庆市| 丹棱县| 垫江县| 东台市| 奉化市| 呼和浩特市| 宜兴市| 界首市| 肇源县| 体育| 宜兰县| 丰镇市| 洛扎县| 益阳市| 台山市| 苍南县| 米易县| 西峡县| 维西| 黑龙江省| 迁西县| 治县。| 敦煌市|