【Python】@property用法简述

简介: 【Python】@property用法简述

参考自:Python的@property是干嘛的?作者:Python测试开发

如果我们设置类的属性私有化,那么可以使用@property 使属性可以被外部访问并修改。

在使用 @property 之前,需要先了解几个概念。

  • _age (单下划线):这种属性表示约定私有,非真正的私有
  • __age(双下划线):表示私有,外部无法访问
  • __age__(前后双下划线):这种属性表示系统属性(可选)
  • age_(后单下划线):这种属性是为了避免和保留关键字冲突。

code01: 自定义学生类

class Student(object):
    _age = 18
    __sex = "man"
    
ming = Student()

可以通过ming._age访问age的值,但是ming.__sex就会报错,提示AttributeError: 'Student' object has no attribute '__age'

既然私有属性无法访问,那么如何在外部进行访问和查看?

code02: 自定义方法访问私有属性

class Student(object):
    _age = 18
    __sex = "man"
    
    def get_sex(self):
        return self.__sex
    
    def set_sex(self, sex):
        self.__sex = sex
ming = Student()

code02中,在Student内自定义了get_sex()set_sex()方法实现对私有属性的访问和修改。

>>> print(ming.get_sex())
'man'
>>> ming.set_sex("woman")
>>> ming.get_sex()
'woman'

code03: 使用@property访问私有属性

如果需要暴露的私有属性比较多,使用自定义方法就比较繁琐了。为此,Python提供了@property,实现同样的功能,并且更方便。

class Student(object):
    _age = 18
    __sex = "man"
        
    @property
    def sex(self):
        return self.__sex
    
    @age.setter
    def sex(self,sex):
        self.__sex = sex
ming = Student()

code03中,使用@property直接将__sex私有属性转变为普通属性。

>>> print(ming.get_sex())
man
>>> print(ming.sex)
man
>>> ming.set_sex("woman")
>>> print(ming.sex)
woman

可以看到,ming.ageming.get_sex()的结果是一样。

不过@property只能访问,不能修改。如果要修改,还要配合setter使用,示例如下:

class Student(object):
    _age = 18
    __sex = "man"
        
    @property
    def sex(self):
        return self.__sex
    
    @sex.setter
    def sex(self,sex):
        self.__sex = sex
ming = Student()

测试:

>>> print(ming.sex)
'man'
>>> ming.age = 20
>>> print(ming.age)
20

emmmm,还算方便。

可能会有些疑问:既然事先要设置私有属性,那为什么还要暴露出去?

个人认为,有些属性设置为私有后,能保证代码安全,而且使用@property能够统一接口和代码风格,如果属性需要设置只读,那么删掉setter方法就行了。如果修改属性的时候需要限制,也可以类似于以下方法进行限制:

class Student(object):
    __age = 18
    __sex = "man"
        
    @property
    def sex(self):
        return self.__sex
    
    @sex.setter
    def sex(self,sex):
        self.__sex = sex
        
    @property
    def age(self):
        return self.__age
    
    @age.setter
    def age(self, new_age):
        if new_age >0 and new_age <= 130:
            self.__age = new_age
        else:
            raise ValueError("[ERROR] Invalid age value!")
ming = Student()

上面的代码将age属性也设置为私有,并且使用@property公开。通过定义setter对age的数值进行限制。如果执行ming.age=200 ,则将会报错。

相关文章
|
1月前
|
缓存 测试技术 开发者
深入理解Python装饰器:用法与实现
【10月更文挑战第7天】深入理解Python装饰器:用法与实现
15 1
|
1月前
|
传感器 大数据 数据处理
深入理解Python中的生成器:用法及应用场景
【10月更文挑战第7天】深入理解Python中的生成器:用法及应用场景
36 1
|
1月前
|
存储 大数据 Python
案例学Python:filter()函数的用法,高级!
`filter()`函数是Python中处理序列数据的强大工具,它允许我们高效地根据条件过滤元素。通过结合匿名函数、常规函数或直接利用Python的内置逻辑,`filter()`提供了灵活且高效的过滤机制,尤其在大数据处理和内存敏感的应用中展现出其价值。掌握 `filter()`的使用,不仅能提升代码的可读性和效率,还能更好地适应Python的函数式编程风格。
33 2
|
1月前
|
Python
深入了解Python中星号变量的特殊用法
深入了解Python中星号变量的特殊用法
17 0
|
1月前
|
PyTorch 测试技术 算法框架/工具
Python中Thop库的常见用法和代码示例
肆十二在B站分享了关于THOP(Torch-OpCounter)的实战教学视频。THOP是一个用于计算PyTorch模型操作数和计算量的工具,帮助开发者评估模型复杂度和性能。本文介绍了THOP的安装、使用方法及基本用例,包括如何计算模型的FLOPs和参数量。
74 0
|
1月前
|
SQL 关系型数据库 MySQL
Python中Pymysql库的常见用法和代码示例
`pymysql` 是一个用于连接 MySQL 数据库的 Python 库,支持 SQL 查询的执行和结果处理。通过 `pip install pymysql` 安装后,可使用 `connect()` 方法建立连接,`cursor()` 创建游标执行查询,包括数据的增删改查,并通过 `commit()` 和 `rollback()` 管理事务,最后需关闭游标和连接以释放资源。
66 0
|
1月前
|
计算机视觉 Python
Python中Pillow库的常见用法和代码示例
Pillow是Python中广泛使用的图像处理库,支持丰富的图像操作功能,包括但不限于打开、保存、缩放、裁剪、旋转、调色等。本文通过一系列示例介绍Pillow的基本用法,涵盖图像的加载与显示、尺寸调整、裁剪与旋转、亮度调整、格式转换、滤镜应用、图像合成及像素级操作等。首先需通过`pip install pillow`安装库,随后可通过导入`PIL.Image`等模块开始图像处理任务。无论是初学者还是进阶用户,都能从Pillow提供的强大功能中获益。
31 0
|
1月前
|
Python
Python pip 操作的几种用法
Python pip 操作的几种用法
|
1月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
15 0
|
2月前
|
Python
Python变量用法——单下划线变量名_ 原创
Python变量用法——单下划线变量名_ 原创