python描述符的应用
使用描述符为python实现类型检测
class Typed:
def __get__(self, instance, owner):
print(instance)
print(owner)
def __set__(self, instance, value):
pass
class Girl:
name = Typed()
def __init__(self, name, age):
self.name = name # 我希望传入的name是str
self.age = age # 我希望传入的age是int
g = Girl("satori", 18)
g.name
'''
<__main__.Girl object at 0x03D28430>
<class '__main__.Girl'>
'''
# 可以看到当我们获取被代理的值,会触发get方法,instance就是Girl的实例对象
# owner则是Girl这个类
class Typed:
def __get__(self, instance, owner):
pass
def __set__(self, instance, value):
print(instance)
print(value)
class Girl:
name = Typed()
def __init__(self, name, age):
self.name = name # 我希望传入的name是str
self.age = age # 我希望传入的age是int
g = Girl("satori", 18)
'''
<__main__.Girl object at 0x03D28430>
satori
'''
# 可以看到当我们给被代理的值赋值的时候,会触发set方法,instance就是Girl的实例对象
# value则是我们赋的值
class Typed:
def __init__(self, key):
self.key = key
def __get__(self, instance, owner):
return instance.__dict__[self.key]
def __set__(self, instance, value):
instance.__dict__[self.key] = value
def __delete__(self, instance):
instance.__dict__.pop(self.key)
class Girl:
name = Typed("name")
age = Typed("age")
def __init__(self, name, age):
self.name = name
self.age = age
g = Girl("satori", 18)
print(g.__dict__)
g.name = "mashiro"
print(g.__dict__)
del g.name
print(g.__dict__)
'''
{'name': 'satori', 'age': 18}
{'name': 'mashiro', 'age': 18}
{'age': 18}
'''
# 等于说 我饶了一圈,并没有直接将属性添加的字典里面,而是向上找了代理,让代理帮我把属性添加的字典里面去
那么,接下来就可以实现类型检测了
class Typed:
def __init__(self, key, except_type):
self.key = key
self.except_type = except_type
def __get__(self, instance, owner):
return instance.__dict__[self.key]
def __set__(self, instance, value):
if isinstance(value, self.except_type):
instance.__dict__[self.key] = value
else:
raise Exception(f"{self.key} must be type {self.except_type}")
def __delete__(self, instance):
instance.__dict__.pop(self.key)
class Girl:
name = Typed("name", str)
age = Typed("age", int)
def __init__(self, name, age):
self.name = name
self.age = age
g = Girl("satori", 18)
print(g.__dict__) # {'name': 'satori', 'age': 18}
try:
import traceback
g = Girl("satori", "18")
except Exception:
print(traceback.format_exc())
'''
Exception: age must be type <class 'int'>
'''
# 于是我们便手动实现了python的类型检测
类的装饰器
# 装饰器不仅可以给函数用,还可以给类用
def deco(obj):
print("======")
return obj
@deco
class Girl:
def __init__(self, name, age):
self.name = name
self.age = age
g = Girl("satori", 18)
print(g.__dict__)
'''
======
{'name': 'satori', 'age': 18}
'''
描述符实现property
class LazeProperty:
def __init__(self, func):
self.func = func
def __get__(self, instance, owner):
# 如果是类调用,那么instance为空
if instance is None:
return self
res = self.func(instance)
setattr(instance, self.func.__name__, res) # 将值设进去,如果有从字典里面找,没有再计算
return res
class Girl:
def __init__(self, name, age):
self.name = name
self.age = age
@LazeProperty # info = LazeProperty(info)
def info(self):
return f"my name is {self.name},age is {self.age}"
g = Girl("satori", 18)
print(g.info) # my name is satori,age is 18
print(Girl.info) # <__main__.LazeProperty object at 0x04EF3910>
python描述符的应用的更多相关文章
- 杂项之python描述符协议
杂项之python描述符协议 本节内容 由来 描述符协议概念 类的静态方法及类方法实现原理 类作为装饰器使用 1. 由来 闲来无事去看了看django中的内置分页方法,发现里面用到了类作为装饰器来使用 ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
- 【转载】Python 描述符简介
来源:Alex Starostin 链接:www.ibm.com/developerworks/cn/opensource/os-pythondescriptors/ 关于Python@修饰符的文章可 ...
- python描述符descriptor(一)
Python 描述符是一种创建托管属性的方法.每当一个属性被查询时,一个动作就会发生.这个动作默认是get,set或者delete.不过,有时候某个应用可能会有 更多的需求,需要你设计一些更复杂的动作 ...
- python描述符 descriptor
descriptor 在python中,如果一个新式类定义了__get__, __set__, __delete__方法中的一个或者多个,那么称之为descriptor.descriptor通常用来改 ...
- Python描述符的使用
Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用 ...
- Python描述符 (descriptor) 详解
1.什么是描述符? python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有 __get__(), __set__(), 和__delete__().如 ...
- python描述符和属性查找
python描述符 定义 一般说来,描述符是一种访问对象属性时候的绑定行为,如果这个对象属性定义了__get__(),__set__(), and __delete__()一种或者几种,那么就称之为描 ...
- Iterator Protocol - Python 描述符协议
Iterator Protocol - Python 描述符协议 先看几个有关概念, iterator 迭代器, 一个实现了无参数的 __next__ 方法, 并返回 '序列'中下一个元素,在没有更多 ...
- Python描述符以及Property方法的实现原理
Python描述符以及Property方法的实现原理 描述符的定义: 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实了__get__(),__set__(),__delete__()中 ...
随机推荐
- selenium+PhantomJS 抓取淘宝搜索商品
最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...
- storm集群安装部署
安装步骤: 搭建Zookeeper集群: 安装Storm依赖库: 下载并解压Storm发布版本: 修改storm.yaml配置文件: 启动Storm各个后台进程. 1. 搭建Zookeeper集群 这 ...
- java线程安全总结 - 1 (转载)
原文地址:http://www.jameswxx.com/java/java%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E6%80%BB%E7%BB%93/ 最近想将ja ...
- TouTiao开源项目 分析笔记19 问答内容
1.真实页面预览 1.1.成果预览 首先是问答列表 然后每个item设置点击事件,进入问答内容列表 然后每一个问答内容也设置点击事件,进入问答详情 1.2.触发事件. 在WendaArticleOne ...
- 1,Python常用库之一:Numpy
Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! Numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,Numpy的速度比Python列表的速度 ...
- 怎么将oracle的sql文件转换成mysql的sql文件-- 费元星
http://jingyan.baidu.com/article/ca41422fe01f251eaf99ed6e.html
- python学习总结---面向对象2
面向对象三大特点 - 封装:既是对数据结构的封装,有是处理数据的方法的封装. - 继承:强调的父子类的关系. - 多态:不同对象调用相同的方法,有不同的响应. 类的继承 - 相关概念 - 继承:父类的 ...
- android studio 配置网络代理
1.首先在vultr网站购买服务器. 然后使用shadowsocksR给服务器配置FQ,再在本地机器配置好shadowsocksR. 参考网址:https://github.com/getlanter ...
- ubantu 系统常见问题
1 搜狗输入法错误: 删除home路径下的 .config/SouGouP...整个文件夹并重启 2 ubantu系统更新:sudo apt-get update 获取最近更新的软件包列表 ...
- Java 打印* 三角形
package anli1; public class sanjiaoxing { public static void main(String[] agrs){ System.out.println ...