
Python高级特性:如何用@property装饰器封装类属性访问
Sprite
发表于 2024年10月20日
Python 中的描述符允许我们控制类的属性如何被访问或修改。我们经常遇到的情况是定义属性,使用 setter 和 getter 方法封装起来。在本文中,我们将讲解 property 装饰器的工作原理和使用。
Python 的面向对象特性,有一些高级用法你可能已经见过,比如@property 装饰器。我们快速看一个示例,了解它是如何工作以及它能为我们做些什么:
class MyClass:
_var = 0
@property
def var(self):
print('获取 var')
return self._var
>>> my_class = MyClass()
>>> print(my_class.var)
获取 var
通过使用 @property
装饰器,我们可以看到已经改变了方法 var
的行为,使其看起来像是类 MyClass
的属性。我们更进一步,添加了一些额外的功能。每当我们读取 var
的值时,我们会在屏幕上打印一行信息。
Python 本身没有私有属性。这意味着我们在类中定义的任何内容都可以从外部访问和修改。在 _var
使用下划线只是一种给开发人员发出信号的方式,告诉他们不应该直接更改 _var
,而应该仅在类内部更改。但实际上如果你想,_var
也是可以从外部被修改的。
但如果我们想限制_var
变量只能是整数,这时候就需要@setter
来限制修改_var
的行为
class MyClass:
_var = 0
@property
def var(self):
print('获取 var')
return self._var
@var.setter
def var(self, value):
print('设置 var')
if not isinstance(value, int):
raise TypeError('var 必须为整数')
self._var = value
然后我们可以测试它:
>>> my_class = MyClass()
>>> print(my_class.var)
获取 var
0
>>> my_class.var = 2
设置 var
>>> my_class.var = 2.0
[...]
TypeError: var 必须为整数
当我们使用装饰器 @property
时,它改变了方法 var
的方式,使得我们可以将其作为装饰器使用。如果我们定义get_var
和set_var
方法也是同样能达到相应的效果,那么跟使用方法相比使用@property
有什么好处呢?其实也只是简化代码外观的问题。比较一下这段代码:
>>> my_class.get_var()
0
>>> my_class.set_var(2)
对比使用@property
:
>>> print(my_class.var)
0
>>> my_class.var = 2
可以说第二种更容易阅读。特别是当我们有许多用于获取和设置值的方法时,属性是很方便的,因为它们通常可以简化接口。
写作不易,欢迎关注
Previous Post
Python多线程编程:如何确保线程安全?评论已关闭。