zoukankan      html  css  js  c++  java
  • Python的自定义属性访问跟描述器以及ORM模型的简单介绍

    一 、 自定义属性访问

    1.__getattr__
    作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。

    2.__getattribute__
    作用:访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError

    总结:当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__
    如果属性存在,就返回这个属性值,如果没有就报 AttrError

    3. __setattr__(self,key,value)
    作用:这个属性在给对象设置属性的时候触发

    例子:
    def __setattr__(self,key,value):
      if key == "age" :
      super().__setattr__(key,18)
      else:
      print("设置属性的时候会触发")
      super().__setattr__(key,value)

    4. __delattr__(self,item):
      print("删除的时候被触发")
      super().__delattr__(item)
      item : 被删除的类属性名
    作用:如果我们不想一个属性被删除,就重写__delattr__方法,如果调用父类的方法就会被删除


    二、描述器

    描述器是一个具有"绑定行为"的对象属性,该对象的属性访问通过描述器协议覆盖:__get__()
    __set__()和__delete__().如果一个对象定义这些方法中的任何一个,它被称为一个描述器。

    1.object.__get__(self,instance,owner)
    获取主类的属性或者该类的一个实例的属性。owner始终是属主,instance是属性访问的实例
    当属性通过owner访问时则为None。这个方法该返回的属性值,或者引发一个AttributeError
    异常

    2.object.__set__(self,instance,value)
    设置属主类的实例instance的属性为一个新值value

    3.object.__delete__(self,instance)
    删除属主类的实例insta的属性
    例子:
    class Filed(object):
      def __get__(self,instance,owner)
      print("访问属性的时候被触发")
      return self.value

    def object.__set__(self,instance,value)
      print("set方法被触发")
      self.value = value

    def object.__delete__(self,instance)
      print("删除属性的时候被触发")
      self.value = None

    class Model(object):
    name = '熊猫'
    attr = Filed() # 描述器对象:会覆盖类属性的相关操作

    三、orm模型介绍
    o objects:类和对象
    R Relation:关系,关系数据库中的表格
    M Mapping:映射

    orm框架的功能
    1.建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
    2.根据设计的模型类生成数据库中的表格
    3.通过方便的配置就可以进行数据库的切换

    例子:描述器在orm模型中的应用

    # 通过描述器实现一个布尔类型的字段类型。
    class Description(object):

    def __get__(self, instance, owner):
      return self.value

    def __set__(self, instance, value):
      if isinstance(value, bool):
        self.value = value
      else:
        raise TypeError("需要一个bool类型的值")

    def __delattr__(self, item):
      self.value = None


    class Data(object):
    gender = Description()

    d = Data()
    d.gender = False
    print(d.gender)


    数据库的字段类型
    mysql常用数据类型:
    整数:int,bit
    小数:deccimal (decimal表示浮点数,如decimal(5,2)表示共存五位数,小数占2位)
    字符串:varchar,char (char不可变长度,varchar可变长度 )
    日期时间:date,time,datetime
    枚举类型:(enum)

  • 相关阅读:
    Enable SPI 1.0 and 1.1 with device tre overlays on BeagleBone
    [转]使用Beaglebone Black的SPI
    真相:中国版BBB用USB连电脑没有盘符的根本原因分析
    Linux下使用locale命令设置语言环境
    locale 详解
    locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
    嵌入式Qt4.7.1安装详解
    【转】补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
    【转】BeagleBone Black USB一线通(3)
    [转]BeagleBone Black USB一线通(2)
  • 原文地址:https://www.cnblogs.com/666666pingzi/p/10928245.html
Copyright © 2011-2022 走看看