一 、 自定义属性访问

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)

Python的自定义属性访问跟描述器以及ORM模型的简单介绍的更多相关文章

  1. python练习笔记——编写一个装饰器,模拟登录的简单验证

    编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...

  2. python cookbook第三版学习笔记十三:类和对象(三)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  3. Python之描述器

    1.描述器的表现 用到三个魔术方法,__get__(), __set__(), __delete__() 方法签名如下 object.__get__(self,instance,owner) obje ...

  4. (转)面向对象(深入)|python描述器详解

    原文:https://zhuanlan.zhihu.com/p/32764345 https://www.cnblogs.com/aademeng/articles/7262645.html----- ...

  5. Python描述器引导(转)

    原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 1. Python描述器引导(翻译) 作者: Raymond ...

  6. Python入门之面向对象编程(四)Python描述器详解

    本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...

  7. python cookbook第三版学习笔记十三:类和对象(四)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  8. python 描述器

    语法简析 一般来说,描述器(descriptor)是一个有”绑定行为”的对象属性(object attribute),它的属性访问被描述器协议方法重写.这些方法是 __get__(). __set__ ...

  9. Python 黑魔法 --- 描述器(descriptor)

    Python 黑魔法---描述器(descriptor) Python黑魔法,前面已经介绍了两个魔法,装饰器和迭代器,通常还有个生成器.生成器固然也是一个很优雅的魔法.生成器更像是函数的行为.而连接类 ...

随机推荐

  1. 基于Swoole的HTTP/HTTPS代理

    N行代码实现一个简单的代理服务器 <?php /** * Web代理服务器(支持http/https) * @author zhjx922 */ class WebProxyServer { p ...

  2. JS中switch语句做选择时为什么可以不用break?

    在JavaScript中,switch语句相比其他语言并没有特殊之处. 在使用时,我们要注意每个分支后都应加一条break语句,否则后面的分支仍然会执行.实际程序中,我发现有时没用break语句,仍然 ...

  3. 四、CentOS 6.5 上传和安装Nginx

    CentOS 6.5 上传和安装Nginx

  4. Codeforce 1255 Round #601 (Div. 2) C. League of Leesins (大模拟)

    Bob is an avid fan of the video game "League of Leesins", and today he celebrates as the L ...

  5. RF(三层封装设计)

    一.用例分层思想 元素层:需要导入 Selenium2Library 库 包含所有的元素定位 流程层:需要导入 元素层.txt 资源 封装用例流程 案例层:需要导入 流程层.txt 资源 输出用例,传 ...

  6. E. Paint the Tree 树形dp

    E. Paint the Tree 题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说 这条边是饱和的,一个树的价值 ...

  7. 基于3D NAND层差异的固态盘请求调度算法研究立项 报告

    Abstract SSD(Solid State Drive),因其超高的读写性能,以及价格的走低趋势逐渐占据市场,为人们带来更好的用户体验,也为企业级的高并行业务需要提供了一定支持,近几年来SSD的 ...

  8. LeetCode--Unique Morse Code Words && Flipping an Image (Easy)

    804. Unique Morse Code Words (Easy)# International Morse Code defines a standard encoding where each ...

  9. 【FPGA篇章五】FPGA函数任务:对讲解函数与任务专题展开详解

    欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 任务和函数也属于过程块,多用于仿真文件设计中,使用两者的目的有所区别: 函数(function):对输入的值执行一些处理,返回一个新的值. ...

  10. NEON中的L可以避免溢出

    在做加法时,比如两个255x255的数值相加,那么正确结果将是130050,对一个最大值为65565的unsigned short是会溢出的,但是如果使用L命令时,则不会产生溢出.这说明L命令,不是先 ...