资讯详情

描述器实现ORM模型

1.__set__方法:设置属性

2.__get__方法:访问属性

3.__delete__方法:删除属性

4.实现描述器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,oner)
    __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

标签: a160贴片三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台