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黑魔法,前面已经介绍了两个魔法,装饰器和迭代器,通常还有个生成器.生成器固然也是一个很优雅的魔法.生成器更像是函数的行为.而连接类 ...
随机推荐
- RF(读写 excel)
1.安装 ExcelLibrary 库:pip install robotframework-ExcelLibrary 但是 Python3.0 通过上面的命令安装 ExcelLibrary 时,会发 ...
- Java——Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...
- 前缀和(P2697 宝石串)
前言 每次做出来什么本来做不出的题目,就忍不住记录一下.不过大多时候隔几天来看,就发现,啊,我当时只是做了一道这么弱智的题目呀,哈哈.前缀和确实不算太难.. 传送门 题目大意: 给你一个字符串只含G和 ...
- I - Coins dp
http://acm.hdu.edu.cn/showproblem.php?pid=2844 这个题目是一个多重背包转化成01背包 题意: Whuacmers拥有bi个面值为ai的硬币,现在他要用这些 ...
- Git 获取远程仓库指定分支内容
1. 在本地一个空的文件夹中 git init (生成本地仓库) 2. 在刚刚的文件夹中随便建立一个文件 ,git add . (为了生成分支)(提交到暂存区) 3. git commit -m'1 ...
- Spring官网阅读(十六)Spring中的数据绑定
文章目录 DataBinder UML类图 使用示例 源码分析 bind方法 doBind方法 applyPropertyValues方法 获取一个属性访问器 通过属性访问器直接set属性值 1.se ...
- Angular 从入坑到挖坑 - Router 路由使用入门指北
一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...
- Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
分析以下需求,并用代码实现 1.定义一个长度为10的int数组,并存入10个int类型的数据,其中有一些数据是重复的 2.利用集合的知识对数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序 3 ...
- mongodb cluster
假设三台机器,ip分别为192.168.1.10,192.168.1.11,192.168.1.12,分别在每台电脑上下载并解压mongodb,关闭防火墙或者开放防火墙端口 一.安装shard 配置文 ...
- 通过10个实例小练习,快速熟练 Vue3.0 核心新特性
Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了. GitHub 博客地址: https://github.com/biaochenxuying ...