Python property 特性详解:原理、封装与使用场景
本文深入解析 Python 中 property 特殊属性的工作原理。通过 @property 装饰器,可将方法转换为类似数据属性的访问方式,实现统一访问原则。文章详细对比了 public、protected 和 private 三种封装模式,展示如何利用 property 模拟私有属性的 getter/setter/deleter 接口,确保类型检查与访问控制,帮助开发者掌握 Python 面向对象编程中的封装技巧。
property 特性的基本概念
1 什么是特性 property
property 是 Python 中一种特殊的属性机制。当访问该属性时,系统会自动执行绑定的函数逻辑,并返回计算结果。
import math
class Circle:
def __init__(self,radius): #圆的半径radius
self.radius=radius
@property
def area(self):
return math.pi * self.radius**2 #计算面积
@property
def perimeter(self):
return 2*math.pi*self.radius #计算周长
c=Circle(10)
print(c.radius)
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter) #同上
'''
输出结果:
314.1592653589793
62.83185307179586
'''
需要注意的是,在基础用法中,通过 property 定义的属性(如 area 和 perimeter)默认是只读的,无法直接进行赋值操作。
c.area=3 #为特性area赋值
'''
抛出异常:
AttributeError: can't set attribute
'''
使用 property 的优势
2 为什么要用 property
将类的方法定义为 property 后,外部对象在通过 obj.name 访问时,无法察觉 name 实际上是执行了一个函数并计算得出的结果。这种设计遵循了统一访问原则,使得代码接口更加简洁和一致。
此外,property 在面向对象封装中还有更深层的应用,具体见下文分析。
面向对象封装与 property 的应用
ps:面向对象的封装通常包含三种访问级别:
【public】
即公开访问,不对成员进行任何限制,对外完全开放。
【protected】
这种封装方式对类外部不公开,但对同类其他成员或子类(形象地说是“儿子”,尽管 parent 本意为父母,中文常称“父类”)可见。
【private】
这种封装对任何外部访问都不公开,仅内部可用。
Python 在语法层面并未像 C++ 那样内置这三种访问修饰符。在 C++ 中,通常将所有数据成员设为私有,并提供 set 和 get 接口进行设置和获取。在 Python 中,可以通过 property 方法实现类似的封装效果。
class Foo:
def __init__(self,val):
self.__NAME=val #将所有的数据属性都隐藏起来
@property
def name(self):
return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
@name.setter
def name(self,value):
if not isinstance(value,str): #在设定值之前进行类型检查
raise TypeError('%s must be str' %value)
self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
@name.deleter
def name(self):
raise TypeError('Can not delete')
f=Foo('egon')
print(f.name)
# f.name=10 #抛出异常'TypeError: 10 must be str'
del f.name #抛出异常'TypeError: Can not delete'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









