Python的property函数

这篇文章我们来学习property函数的用法,它是一种创建属性的机制。

Python中访问对象的属性可以这么做:实例名.变量名。但是有些人却不同意这种访问方法,他们觉得这样做破坏了封装的原则,对象的状态对于外部应该是隐藏的。因此,Python中更推荐使用私有特性,通过在名字前面加上双下划线,然后getter,setter方法访问这些特性。

然而,将“实例名.变量名”的方式改为使用getter、setter方法将使代码变得更加复杂臃肿。如果有一种方法能够使简单的访问特性又能保持代码的规范性就好了。property正是解决这一问题的方案。

废话不多说,我们直接用一个例子来解释property函数的用法。

class Test: 
	def __init__(self): 
		self._x = None 
	
	def get_x(self): 
		print("I'm the getter method") 
		return self._x 
	
	def set_x(self, value): 
		print("I'm the setter method") 
		self._x = value 

	def del_x(self): 
		print("I'm the deleter method") 
		del self._x 

	# 设置doc参数 
	x = property(get_x, set_x, del_x, "I'm the 'x' property.") 

t = Test()
t.x = '100' #等同于t.set_x("100")
print(t.x)  #等同于print(t.get_x())
t.x='90'
print(t.x)     

程序的执行结果为:

Property函数的定义为:

property(fget=None, fset=None, fdel=None, doc=None)  

其中,fget是获取属性值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个文档字符串。property函数的参数都是可选的,若没有参数,产生的属性既不可读也不可写。若只有一个取值方法,产生的属性是只读的。

事实上,property并不是一个真正的函数,它是拥有许多特殊方法的类:__get__、__set__、__del__。这三个方法合在一起定义了描述符规则。实现了任何一个方法的对象就可称为描述符(descriptor)。当程序读取一个特性时,若该特性被绑定到实现了__get__方法的对象上时,那么就会调用__get__方法。更具体的descriptor协议我们会在后续的文章中探讨。

如上所示,我们还是实现getter、setter方法,只需要加入property的语句就能实现特性的简单访问。

当然,property除了上述这种用法外,还可以使用@property实现相同的功能。我们还是简单粗暴的直接给出一个例子。

class Test: 
	def __init__(self): 
		self._x = None 
	
	@property
	def x(self): 
		print("I'm the getter method") 
		return self._x 
	
	@x.setter
	def x(self, value): 
		print("I'm the setter method") 
		self._x = value 

	@x.deleter
	def x(self): 
		print("I'm the deleter method") 
		del self._x 

t = Test()
t.x = '100'
print(t.x)
t.x='90'
print(t.x)  

程序的运行结果为:

可以看到的是,运行结果和上述property()函数一样。 把get方法变为属性只需加上@property装饰器,然后@property装饰器又创建另外的装饰器@x.setter(用于把setter方法变成属性赋值)和@x.deleter。我们也可以自只定义getter方法而不定义setter方法,让属性变为只读。

以上是两种property的实现方式,使用起来简单方便,如果能合理利用可以写出很好的代码。

猜你喜欢

转载自blog.csdn.net/dxk_093812/article/details/83212231