@property的学习与使用

知识点

@property 是 Python 中用于将类方法转变为属性访问的装饰器,它可以让你以属性的形式访问类的某些方法,从而提供了更简洁的语法。

通常情况下,属性访问会通过 obj.attribute 这样的方式进行,但是如果你希望在获取或者设置属性的时候执行一些逻辑,可以使用 @property 来实现这个目的。

以下是 @property 的基本用法示例:

class Person:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @property
    def full_name(self):
        return f"{self.first_name} {self.last_name}"

    @full_name.setter
    def full_name(self, value):
        first, last = value.split(' ')
        self.first_name = first
        self.last_name = last

    @full_name.deleter
    def full_name(self):
        del self.first_name
        del self.last_name

# 创建一个Person实例
p = Person('John', 'Doe')

# 使用@property访问full_name
print(p.full_name)  # 输出: John Doe

# 使用@property setter方法设置full_name
p.full_name = 'Jane Smith'
print(p.full_name)  # 输出: Jane Smith

# 使用@property deleter方法删除full_name
del p.full_name

# 尝试访问被删除的属性将引发AttributeError
print(p.full_name)  # 输出: AttributeError: 'Person' object has no attribute 'full_name'

在上述示例中:

  • full_name 方法被装饰为 @property,所以可以像访问属性一样访问它。
  • @full_name.setter 装饰器允许我们在设置属性时执行一些逻辑,这里将一个完整的名字拆分成了名字和姓氏。
  • @full_name.deleter 装饰器定义了一个用于删除属性的方法。

使用 @property 装饰器可以让你在需要执行额外逻辑时,以属性的形式访问类的方法,使得代码更加清晰和简洁。

学习测试代码

"""
# -*- coding: utf-8 -*-
# @Time    : 2023/9/21 9:54
# @Author  : 王摇摆
# @FileName: practice2.py
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44943389?type=blog
"""


# 请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution
class Screen(object):

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, width):
        self._width = width

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, height):
        self._height = height

    @property
    def resolution(self):
        return self._width * self._height


if __name__ == '__main__':
    # 测试:
    s = Screen()
    s.width = 1024  # s.width(100)
    s.height = 768

    print('resolution =', s.resolution)
    if s.resolution == 786432:
        print('测试通过!')
    else:
        print('测试失败!')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王摇摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值