Python property 特性详解:原理、封装与使用场景

纸上星河
纸上星河
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析 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'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表