初学python描述符

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


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的逻辑隔离到单独的类中来处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值