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)
Python的自定义属性访问跟描述器以及ORM模型的简单介绍的更多相关文章
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- python cookbook第三版学习笔记十三:类和对象(三)描述器
__get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...
- Python之描述器
1.描述器的表现 用到三个魔术方法,__get__(), __set__(), __delete__() 方法签名如下 object.__get__(self,instance,owner) obje ...
- (转)面向对象(深入)|python描述器详解
原文:https://zhuanlan.zhihu.com/p/32764345 https://www.cnblogs.com/aademeng/articles/7262645.html----- ...
- Python描述器引导(转)
原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 1. Python描述器引导(翻译) 作者: Raymond ...
- Python入门之面向对象编程(四)Python描述器详解
本文分为如下部分 引言——用@property批量使用的例子来引出描述器的功能 描述器的基本理论及简单实例 描述器的调用机制 描述器的细节 实例方法.静态方法和类方法的描述器原理 property装饰 ...
- python cookbook第三版学习笔记十三:类和对象(四)描述器
__get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...
- python 描述器
语法简析 一般来说,描述器(descriptor)是一个有”绑定行为”的对象属性(object attribute),它的属性访问被描述器协议方法重写.这些方法是 __get__(). __set__ ...
- Python 黑魔法 --- 描述器(descriptor)
Python 黑魔法---描述器(descriptor) Python黑魔法,前面已经介绍了两个魔法,装饰器和迭代器,通常还有个生成器.生成器固然也是一个很优雅的魔法.生成器更像是函数的行为.而连接类 ...
随机推荐
- 2019 ICPC 南京网络赛 F Greedy Sequence
You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...
- QT入门指导
罗列一些QT学习资料 1. http://www.qter.org/ 包含很多教程,包括著名的<学习之路>系列. 2. http://www.qtcn.org/bbs/index-htm- ...
- 博客第一天:Typora和Markown语法初始
------------恢复内容开始------------ Markdown学习 一级标题:#+空格 二级标题:##+空格 三级标题:###+空格 四级标题:####+空格 五级标题:#####+空 ...
- HC32F003C4PA GPIO Output
1.打开启动文件,找到并跳转至SystemInit函数 void SystemInit(void) { stc_clk_systickcfg_t stcCfg; // TODO load trim f ...
- 使用天祥TX-1C调试DS18B20温度传感器的收获
翻查DS18B20的DataSheet编写操作函数,其过程遇到了不少坎,记下来备查. 对于单总线的DS18B20芯片,首先严格按照时序图写出正确的“写0”.“写1”和“读0.1”的基础函数,再以此写出 ...
- 02_互联网基本原理和HTML入门
上节课的知识复习 互联网的原理:服务器.浏览器.HTTP.知道网页文件是真实的物理存在,用HTTP请求这个文件. 要知道网址的含义:http://www.iqianduan.cn/aaa 请求哪个文件 ...
- Linux编程实现递归查找文件
命令格式如下:SCRIPT_NAME SEARCH_ON_DIR SEARCH_FILENAME #!/bin/bash Find(){ files=`` for file i ...
- JUC之ReentrantLock源码分析
ReentrantLock:实现了Lock接口,是一个可重入锁,并且支持线程公平竞争和非公平竞争两种模式,默认情况下是非公平模式.ReentrantLock算是synchronized的补充和替代方案 ...
- 【csu oj 1542】线段树
题目大意:给定一个合法的括号序列(只包含'(',')'),有q次操作,对每次操作改变一个位置的括号,求最左端的位置,使得改变这个位置上的括号以后,新序列合法(完全配对). 思路:对于合法的括号序列,如 ...
- Mybatis学习笔记汇总(包括源码和jar包)
博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...