我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python特性--property

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python特性--property

在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的。那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值。那么,问题来了,当有一天需求变了,你需要反向操作你之前实现的类,你需要通过传入那个需要运算得来的值来获取参与运算的属性值。显然,我们需要重新定义很多的函数来获取那些属性值。这样的类是很不友好的,其他人在调用你定义的类,需要做大量的修改。那么有没有什么解决的办法呢?python提供了一样东西:特性(property)。property避免了以上的问题,使得调用类的人只要知道类怎么用就可以了,而不用了解它是怎么实现的。这很好的实现了面向对象语言的封装性。

这样说来还是有点抽象,那么到底怎么用呢?我下面以一个例子说明property的用法。

以购买水果为例

先粘贴一段代码:

class Fruits:
    def __init__(self):
        self.name = 'apple'
        self.percost = 0.5
        self.color = 'red'
        self.num = 0

    def set_money(self,money):
       self.num = money/self.percost

    def get_money(self):
        return self.percost*self.num

    money = property(get_money,set_money)

 

我定义一个水果类,初始化水果的名称为apple,单个价格(percost)为0.5元,个数(num)为0。我还定义了get_money方法,用于获取付钱的金额

接下来我们实例化fruit,并为num赋值为10,即要买十个苹果,那么我们想获得需要付多少钱的时候,只要通过调用get_money就可以了。但是奇怪的是,我为什么可以通过直接用fruit.money就可以获得实际的付款金额呢?先别急,接下来慢慢解释。我先往下讲。

读者会发现,我还定义了一个set_money函数和类属性money,那么它们究竟有什么用?从property的参数可以知道,有一个是get_money,就会我们上面想获得的付款金额。通过将get_money传入property函数获得结果赋值给money。那么我们就可以在实例对象中直接通过属性(即fruit.money)的形式来获取付款金额了。

那么set_money又有什么用呢?这就是我文章开头所说的,当有一天需求变了,需要对类的实例对象进行反向操作的时候,我们怎么有效减少代码的数量,提高效率。这个set_money可以使我们在通过fruit.money传入付款金额的时候,接下来通过fruit.num来获取购买的苹果数量。是不是很神奇?

具体的代码实现和结果可以看下面我截出来的两张图。

  

结果:

 

一个property函数就可以有如此大的威力,即可以正向操作,由可以反向操作。那么它是如何实现的呢?

   通过阅读源码,可以知道,property函数其实质上是一个类,传入的参数有4个,即fget,fset,fdel和doc。分别对应于获取属性值,设置属性值,删除属性值和文档字符串。他们一起定义了所谓的描述符协议。

 

实际上,这个类包含了一些魔法方法,这些魔法方法为_ _set_ _,_ _get_ _,_ _del_ _。分别在类的属性的设置,获取和删除的时候自动调用。那么可以理解,上面我们定义的get_money,set_money方法,其实内部是调用了上面的魔法方法。当我们在设置fruit.num的时候,自动就会调用set_money方法,那么就会返回我自己写的方法的值,即ruturn self.percost * self.num的结果。反过来,我在设置fruit.money的时候,就会自动调用set_money方法,同样通过我定义的方法,获得了水果的个数,即self.num。那么就可以通过fruit.num轻而易举地获得这个计算出来的个数量了。通过将set_money和get_money方法作为参数传入property函数,我们就可以随时获得想要的结果。在不同的情况获取不同的计算值。

特性property是一个强大的函数,虽然它的内部实现原理很简单,但在实际应用中,笔者认为还是很有用处的。就如我上面所说的需求下,用property可以很好地解决一些问题。更多的用途还需要在实践中去慢慢思考和体会。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python特性--property

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python特性--property

在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的。那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值。那么,问题来了,当有一天需求变了,你需要反向操作你之
2023-01-30

CSS中的@property特性是什么

小编给大家分享一下CSS中的@property特性是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是csscss是一种用来表现HTML或XML等文件样式的
2023-06-14

python中@Property属性如何使用

这篇文章主要介绍“python中@Property属性如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中@Property属性如何使用”文章能帮助大家解决问题。一、前言本文介绍的属
2023-07-02

Python3 property属性

python3中的property有一个很有意思的功能,它能将类中的方法像类属性一样调用!class property(fget=None, fset=None, fdel=None, doc=None)我们先来简单了解一下这个proper
2023-01-31

python3--面向对象的三大特性:封装,property,classmethod,staticmethod

python中的封装隐藏对象的属性和实现细节,仅对外提供公共访问方式好处:1 将变化隔离2 便于使用3 提供复用性4 提高安全性封装原则1 将不需要对外提供的内容都隐藏起来2 把属性都隐藏,提供公共方法对其访问私有变量和私有方法在pytho
2023-01-30

Python中property属性的作用是什么

本篇内容主要讲解“Python中property属性的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中property属性的作用是什么”吧!前言Python 动态属性的概念
2023-06-30

Python中property标签属性怎么使用

在Python中,可以使用@property装饰器来定义一个属性的getter方法,并使用@property.setter装饰器来定义其setter方法。下面是一个简单的示例:```pythonclass Person:def __init
2023-09-16

Python @property 详解

本文讲解了 Python 的 property 特性,即一种符合 Python 哲学地设置 getter 和 setter 的方式。Python 有一个概念叫做 property,它能让你在 Python 的面向对象编程中轻松不少。在了解它
2023-01-30

python中@property和pro

1、基本的@property使用,可以把函数当做属性用class Person(object): @property def get_name(self): print('我叫xxx') def main():
2023-01-30

python使用@property @x

@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。1》只有@property表示只读。2》同时有@property和@x.setter表示可读可写。3
2023-01-31

Python 高级特性

这章有关Python中被认为高级的特性——就是说并不是每个语言都有的,也是说它们可能在更复杂的程序或库中更有用,但不是说特别特殊或特别复杂。强调这点很重要:这一章仅仅关于语言自身——关于辅之以Python的标准库功能的特殊语法所支持的特性,
2023-01-31

Python学习之property

Python中使用Property函数可以将类中的函数当作属性来调用。案例 1 __metaclass__=type 2 class Rectangle: 3 def __init__(self): 4 self.w
2023-01-30

Python--高级特性

高级特性生成器读取生成器元素的两种方式:•g.next()•for循环读取; (生成器实质上是可迭代对象);•列表生成式(列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式), 当生成时元素即打印, 会占用内存;
2023-01-31

python的特性 - 切片

概述前面我们知晓,有些数据类型可以直接使用索引index来访问序列中的元素,同时索引还可以分为正向和负向的。Python中的切片操作,也会用到索引。而且切片非常灵活,可以很方便地对有序序列进行切片操作,使用频率非常高。一、切片介绍试用对象:
2023-01-31

python @property用法作用

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。详见链接:廖雪峰python3使用@property练习请利用@property给一个Screen对象加
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录