初学python描述符

原创 2016年08月29日 23:55:35
描述符:当某属性被访问时,你也许想创建一个日志记录,而最好的方法编写一个执行符合需要的动作函数,然后指定它在属性被访问时运行。


property---把函数的调用伪装成对属性的访问
例子:
class User(object):
	def __init__(self,name,age):
		self.name=name
		self.age=age


	def change_age(self,age):
		if age < 0:
			raise ValueError("Age should larger than 0") 
		self.age=age
以上代码中,运行
a=User("Tom",12)
a.age //12
a.change_age(-20) //"Age should larger than 0"
a.age=13
a.age  //13


利用property之后可以改成:
class User(object):
	def __init__(self,name,age):
		self.name=name
		self.age=age


	@property
	def age(self):
		#do something...
		return self._age


	@age.setter
	def age(self,value):
		if value < 0:
			raise ValueError("Age should larger than 0")
		self._age=value


以上代码中,运行
a=User("Tom",12)
a.age //12
a.age=-20 //"Age should larger than 0"   (把函数的调用伪装成对属性的访问)
a.age=13
a.age  //13


对property来说,最大的缺点就是它们不能重复使用。就是说如果你多几个类似age的属性时,你需要每个都设置property和相应的setter,这样就非常繁琐。虽然property可以让类从外部看起来接口整洁漂亮,但是却做不到内部同样整洁漂亮。描述符就是解决此类问题的关键技术。当某属性被访问时,你也许想创建一个日志记录,而最好的方法编写一个执行符合需要的动作函数,然后指定它在属性被访问时运行。

利用描述符的情况:
#coding=utf-8
from weakref import WeakKeyDictionary

class NonNegative(object):
	def __init__(self,default):
		self.default = default   #默认值
		self.data = WeakKeyDictionary() #为了防止内存泄漏,不想仅仅因为它在描述符的字典中就让一个无用的实例一直存活着


	def __get__(self,instance,owner):
		return self.data.get(instance,self.default) #给出字典中instance的值,如果instance为空则返回默认值


	def __set__(self,instance,value):
		if value < 0:
			raise ValueError("Negative value not allowed")
		self.data[instance] = value  #设置instance键值




class User(object):


	age = NonNegative(0)  #创建NonNegative的一个实例名为age,作为一个NonNegative对象,这里的描述符一定要放在类的层级上。
	score = NonNegative(0)


	def __init__(self,name,age,score):
		self.name=name
		self.age=age
		self.score = score


u = User("Tom",12,34)
print u.age   # calls User.age.__get__(u,User)
u.score = 45  # calss User.score.__set__(u,45)
print u.score   # calls User.score.__get__(u,User)


这与我们平时的User的各个实例的维护方式不太相同。在这里,我们的age作为一个实例,其中的data字典中用来存储不同User实例的age的值。
描述符可以用来做什么——它们提供了一种方法将property的逻辑隔离到单独的类中来处理。

python描述符详解

本文主要介绍描述符的定义,个人的一些理解;什么是数据描述符;什么是非数据描述符;描述符的检测等。希望看完这篇文章后,你对描述符有了更清晰的认识。知道怎么判断一个对象是不是描述符,知道如果定义一个描述符...
  • Allenalex
  • Allenalex
  • 2017年01月06日 15:14
  • 838

Python之美[从菜鸟到高手]--玩转描述符和属性

你知道property的实现原理吗? 你知道@classmethod,@staticmethod的原理吗?如果你摇头了,那么这篇文章你肯定不能错过,让我们开始吧?         在说property...
  • yueguanghaidao
  • yueguanghaidao
  • 2013年08月25日 14:37
  • 11442

python描述符

面试问到的。从没听说过这个东西。今天总结一下。 --------------------------------- 在Python中,访问一个属性的优先级顺序按照如下顺序: 1.类属性 2.数...
  • imzoer
  • imzoer
  • 2013年04月11日 14:40
  • 4696

python描述符和装饰符

你知道property的实现原理吗? 你知道@classmethod,@staticmethod的原理吗?如果你摇头了,那么这篇文章你肯定不能错过,让我们开始吧?         在说prope...
  • prom1201
  • prom1201
  • 2016年03月03日 22:08
  • 511

python之描述符

前言感谢文章,python描述符。之前对这个东西一直是听说过但是不知道怎么回事,看了几篇文章也是不知道为什么有这样的设计,这篇文章看了之后算是基本上懂了,所以稍微记录一下自己的理解。propertyp...
  • qq_29343201
  • qq_29343201
  • 2016年07月15日 23:05
  • 253

python学习笔记6.5-类中描述符的使用

描述符(Descriptor)就是以特殊方法get(), set(), delete()的形式实现了三个核心的属性访问操作(set,get,delete)的类。这些方法接受类实例作为输入来工作。之后,...
  • jinxiaonian11
  • jinxiaonian11
  • 2016年12月18日 16:17
  • 20732

进程间共享文件描述符

进程间传递文件描述符unix一个传统的服务器模型就是一连接一进程模型。进程对地址空间的保护作用是显而易见的,为某个连接服务的进程出现错误导致崩溃,其它的进程还能正常的运行。但是,当连接数大时,创建过多...
  • a675311
  • a675311
  • 2015年10月26日 15:30
  • 772

python 7-6 如何使用描述符对实例属性做类型检查,分别实现set,方法,在set内使用isinstance做类型检查

python 7-6 如何使用描述符对实例属性做类型检查解决方案使用描述符来实现需要类型检查的属性: 分别实现get,set,__delete方法 在set内使用isinstance函数做类型检...
  • u013679490
  • u013679490
  • 2017年01月28日 16:40
  • 195

Python-学习-小例子练习

网上了点小例子,练习一下下,都是特别简单的。而且这些代码也都是找的网上的代码,目的是在于练习一下Python和熟悉下Python的编码风格等等 第一个,有1、2、3、4个数字,能组成多少个互不相同...
  • z609932088
  • z609932088
  • 2016年09月02日 09:54
  • 534

初学Python-第二章练习题

Python 核心编程练习题-第二章
  • hezhentaolove
  • hezhentaolove
  • 2015年11月23日 22:03
  • 91
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初学python描述符
举报原因:
原因补充:

(最多只允许输入30个字)