Skip to content

AI编程自学网

ai2opencode您的编程助手

Menu
  • 网站首页
  • WordPress专栏
  • 程序员内功
  • 副业和涨工资
  • Windows11
Menu

Python 中的@property——它是什么以及如何使用它?

Posted on 2021年8月4日 by ai2opencode

在@propertyPython中是一个属性装饰。它可以像访问常规属性一样访问对象的方法:

mass.pounds() ---> mass.pounds

您可以使用属性装饰器为类的方法提供 getter、setter 和 deleter 功能。

装饰器概述

在深入研究 Python 的属性装饰器之前,让我们先简单了解一下什么是装饰器。
在 Python 中,装饰器用@.
装饰器是一种扩展函数或类行为的方法。
简而言之,这段代码:

def extend(func):
   return func
@extend
def some_func():
    pass

是否与此相同:

def extend(func):
    return func
def some_func():
    pass
some_func = extend(some_func)

它some_func()通过extend()函数的行为扩展了 的行为。

Python中的@property

将类中的方法标记为@property可以像访问属性一样访问对象的方法:

mass.pounds() ---> mass.pounds

例子
假设您有一个Mass以公斤和磅为单​​位存储质量的类。

class Mass:
    def __init__(self, kilos):
        self.kilos = kilos
        self.pounds = kilos * 2.205

让我们测试一下它是如何工作的:

mass = Mass(100)
print(mass.kilos)
print(mass.pounds)

输出:

100
220.5

让我们改变公斤的数量,看看磅会发生什么:

mass.kilos = 500
print(mass.pounds)

输出:

220.5

磅数保持不变。这是因为它没有更新。
你可以通过创建一个pounds()方法并去掉pounds属性来解决这个问题。此方法将公斤转换为磅:

class Mass:
    def __init__(self, kilos):
        self.kilos = kilos

    def pounds(self):
        return self.kilos * 2.205

现在您可以更改公斤数,磅数将始终保持最新

mass = Mass(100)
print(mass.pounds())
mass.kilos = 500
print(mass.pounds())

输出:

220.5
1102.5

进行此更改后,您将无法再不mass.pounds使用括号进行调用。这是因为pounds()现在是一个方法——而不是一个属性。
如果Mass该类在其他地方使用,则可能会破坏代码。
这就是@property装饰器的帮助所在。
如果你用 标记pounds()方法@property,它允许你mass.pounds再次不带括号调用:

class Mass:
    def __init__(self, kilos):
        self.kilos = kilos

    @property
    def pounds(self):
        return self.kilos * 2.205

让我们测试一下:

mass = Mass(100)
print(mass.pounds)
mass.kilos = 500
print(mass.pounds)

它就像一个魅力。该pounds()方法现在称为getter方法。它不存储对象中的磅数,但可以通过将公斤转换为磅来获取。
在这个改变之后,如果你能像这样更新磅数不是有意义吗?

mass.pounds = 1000

但是,如果您运行此代码,则会导致错误:

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    mass.pounds = 1000
AttributeError: can't set attribute

错误说您无法设置该pounds属性。这是合理的,因为pounds()仍然是一个方法,不会在对象中存储磅数。所以只能获取磅数,不能设置。
但是您可以更改公斤数。因此,您可以通过mass.pounds使用setter方法间接更改公斤数。
为了能够设置磅数,请定义一个 setter 方法。这种方法:
采用新的磅数。
将其转换为公斤。
将公斤分配给质量对象。
要将其转换为代码,请添加一个同样命名pounds()为Mass该类的 setter 方法:

@pounds.setter
def pounds(self, pounds):
    self.kilos = pounds / 2.205

现在类看起来像这样:

class Mass:
    def __init__(self, kilos):
        self.kilos = kilos

    @property
    def pounds(self):
        return self.kilos * 2.205

    @pounds.setter
    def pounds(self, pounds):
        self.kilos = pounds / 2.205

您可以测试Mass该类:

mass = Mass(100)
print(mass.kilos)
print(mass.pounds)
mass.pounds = 1100
print(mass.kilos)
print(mass.pounds)

输出:

100
220.5
498.8662131519274
1100.0

现在您可以访问和间接修改pounds.
但是如果你想删除英镑调用del mass.pounds呢?这没有意义,因为pounds没有存储在对象中。
但是您可以为磅创建一个删除器方法,间接删除公斤。
例如,pounds()在Mass类中添加删除器方法:

@pounds.deleter
def pounds(self):
    print("Resetting mass!")
    self.kilos = 0

在这个删除器中,公斤数被设置为,0并且一条消息被打印到控制台。
这是该Mass课程的最终版本:

class Mass:
    def __init__(self, kilos):
        self.kilos = kilos

    @property
    def pounds(self):
        return self.kilos * 2.205

    @pounds.setter
    def pounds(self, pounds):
        self.kilos = pounds / 2.205

    @pounds.deleter
    def pounds(self):
        print("Resetting mass!")
        self.kilos = 0

它不存储磅数。相反,它具有三种pounds()方法。一种用于间接:
得到磅。
设定磅数。
删除磅。
这些方法中的每一个都间接地修改公斤,但在语法上使用磅。
让我们创建一个最终Mass对象并删除pounds,看看会发生什么:

mass = Mass(100)
del mass.pounds
print(mass.kilos)
print(mass.pounds)

输出:

Resetting mass!
0
0.0

结论

@property 在 Python 中可以调用像属性这样的方法:

mass.pounds() ---> mass.pounds

您可以使用属性装饰器间接修改对象的属性。为此,您需要定义 getter、setter 和 deleter 方法。


欢迎加入QQ群

QQ群名称:Python教程
QQ群号:732484294

Related posts:

  1. 微服务之使用 SpringBoot 构建 Rest 微服务的最佳实践
  2. Javascript问答之假设我熟悉用jQuery开发客户端应用程序,但现在我想开始使用AngularJS。你能描述一下必要的范式转变吗?
  3. 我是如何成为全栈开发人员之 01 理解编程范式
  4. Javascript问答之 JavaScript 闭包是如何工作的?

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

工具区

繁体中文

近期文章

  • Windows11教程大全之Windows 11到底是什么
  • Windows 11 的第一个大更新来了:2022年新增6大新功能
  • Chrome 控制台实用程序开发 之 09 monitor(function) 监视窗口对象上的所有调整大小事件
  • Chrome 控制台实用程序开发 之 08 keys(object) 监视窗口对象上的所有调整大小事件
  • Chrome 控制台实用程序开发 之 07 keys(object) 获取数组key值

近期评论

  1. J1o! - V2EX-Flutter 您应该选择哪个 IDE/编辑器?(Android Studio VS Code Intellij IDEA)发表在Flutter 您应该选择哪个IDE/编辑器?(Android Studio VS Code Intellij IDEA)
  2. 编程书籍推荐之《Think Like a Programmer: An Introduction to Creative Problem Solvin》 - AI编程自学网发表在如何解决任何编程问题

    推荐文章

    1. 微服务之使用 SpringBoot 构建 Rest 微服务的最佳实践
    2. Javascript问答之假设我熟悉用jQuery开发客户端应用程序,但现在我想开始使用AngularJS。你能描述一下必要的范式转变吗?
    3. 我是如何成为全栈开发人员之 01 理解编程范式
    4. Javascript问答之 JavaScript 闭包是如何工作的?
    • 0经验开发
    • Access
    • adsense
    • Android
    • App开发赚钱
    • AWS云计算
    • Chrome
    • Chrome 控制台实用程序开发
    • CSS
    • CSS 基础教程
    • Flutter
    • Flutter基础
    • Flutter杂谈
    • HarmonyOS 鸿蒙
    • HarmonyOS基础
    • HTML
    • HTML基础
    • HTML技巧
    • JavaScript
    • JavaScript 基础
    • JavaScript 技巧
    • JavaScript 简介
    • JavaScript问答
    • oracle
    • oracle
    • pandas教程
    • PHP
    • PHP 杂谈
    • Python
    • Python实战
    • Python技巧
    • Python杂谈
    • SEO 技巧
    • Tiktok抖音小程序
    • UI设计
    • Web编程
    • Windows11
    • WordPress
    • WordPress 部署云主机VPS
    • WordPress 问答
    • WordPress 问答已解决
    • WordPress 问答未解决
    • WordPress使用技巧
    • WordPress插件
    • WordPress杂谈
    • WordPress盈利
    • Wordpress配置
    • WorPress建站技巧
    • 云服务推广
    • 云计算
    • 人工智能与机器学习
    • 低代码与无代码
    • 信息论基础
    • 元宇宙
    • 副业和涨工资
    • 副业技巧
    • 在线课程
    • 学习编程技巧
    • 小程序
    • 建站指南
    • 微服务架构
    • 微软
    • 思想类
    • 技术文章技巧
    • 技术潮流
    • 技能考试
    • 抖音小程序
    • 教育信息化
    • 数据库
    • 未分类
    • 程序员内功
    • 程序员装备
    • 经典书籍学习
    • 编程书籍推荐
    • 编程书籍推荐
    • 编程人生
    • 编程历史
    • 编程市场研究
    • 编程思想
    • 编程意义
    • 编程组件
    • 编程能力提高
    • 编程语言
    • 编程面试与工作
    • 腾讯云
    • 视频博主
    • 计算机科学中的数学
    • 读书笔记
    • 软件估价
    • 软考
    • 通识知识
    • 销售 API
    • 阿里云
    • 高级信息系统项目管理师
    • 高级系统架构设计师

    Discord JavaScript SpringBoot windows11 元宇宙 微服务 程序员内功 计算机视觉 问题未解决

    登录
    © 2022 AI编程自学网 | Powered by Minimalist Blog WordPress Theme