iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python property的使用技巧分享
  • 519
分享到

python property的使用技巧分享

pythonproperty 2022-06-02 22:06:59 519人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

property属性 一种用起来像是使用实例属性一样的特殊属性,可以对应于某个方法 既要保护类的封装特性,又要让开发者可以使用 对象.属性 的方式操作方法,@property 装饰器,可以直接通过方法名来访问方

property属性

一种用起来像是使用实例属性一样的特殊属性,可以对应于某个方法

既要保护类的封装特性,又要让开发者可以使用 对象.属性 的方式操作方法,@property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对  () 小括号。

来看下求圆的面积的例子


class Circle(object):

    PI = 3.14

    def __init__(self, r):
        # r圆的半径
        self.r = r
        self.__area = self.PI * self.r * self.r
    
    @property
    def area(self):
        return self.__area

    def get_area(self):
        return self.__area


In [2]: c = Circle(10)

In [3]: c.area
Out[3]: 314.0

In [4]: c.get_area()
Out[4]: 314.0

property属性的定义和调用要注意一下几点:

  • 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个 self 参数
  • 调用时,无需括号 ()

实例方法:c.get_area()

property装饰的方法:c.area

具体实例

对于某商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第 m 条到第 n条的所有数据 这个分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n
  • 根据 m 和 n 去数据库中请求数据

class Pager(object):
    
    def __init__(self, current_page):
        
        # 用户当前请求的页码(第一页、第二页...)
        self.current_page = current_page
        
        # 每页默认显示10条数据
        self.per_items = 10 

    @property
    def start(self):
        val = (self.current_page - 1) * self.per_items
        return val

    @property
    def end(self):
        val = self.current_page * self.per_items
        return val

# ipython测验
In [2]: p = Pager(1)


In [3]: p.start		# 就是起始值,即:m
Out[3]: 0

In [4]: p.end		# 就是结束值,即:n
Out[4]: 10

In [5]: p = Pager(2)

In [6]: p.start
Out[6]: 10

In [7]: p.end
Out[7]: 20

property属性的有两种方式

  • 装饰器 即:在方法上应用装饰器 @property
  • 类属性 即:在类中定义值为 property 对象的类属性 property()

装饰器方式

在类的实例方法上应用 @property 装饰器

Python中的类有旧式类 和  新式类,新式类 的属性比 旧式类的属性丰富。

旧式类

旧式类,具有一种 @property 装饰器


class Goods:
    
    def __init__(self, name):
        self.name = name
        
    @property
    def price(self):
        return 100
    
# ipython测验
In [10]: g = Goods('手表')

In [11]: g.price
Out[11]: 100

新式类

新式类,具有三种 @property 装饰器


class Goods:
    """
    python3中默认继承object类
    以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter
    """
    @property
    def price(self):
        print('@property')

    @price.setter
    def price(self, value):
        print('@price.setter')

    @price.deleter
    def price(self):
        print('@price.deleter')

        
# ipython测验
In [13]: g = Goods()

In [14]: g.price
@property

In [15]: g.price = 100
@price.setter

In [16]: del g.price
@price.deleter
  • g.price  单独调用自动执行 @property 修饰的 price 方法,并获取方法的返回值
  • g.price = 100 赋值自动执行 @price.setter 修饰的 price 方法,并将 100 赋值给方法的参数
  • del g.price 删除自动执行 @price.deleter 修饰的 price 方法

注意

  • 旧式类中的属性只有一种访问方式,其对应被 @property 修饰的方法
  • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter 修饰的方法

由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。


# Goods类@property应用

class Goods(object):

    def __init__(self, name, price):
        # 原价
        self.original_price = price

        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        print('删除商品原价')
        del self.original_price

        
# ipython测验
In [22]: g = Goods('小米手机', 2000)

In [23]: g.price
Out[23]: 1600.0

In [24]: g.price = 3000

In [25]: g.price
Out[25]: 2400.0

In [26]: del g.price
删除商品原价

In [27]: g.price
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-38ee45b469f2> in <module>
----> 1 g.price

<ipython-input-18-d5ea66eb7ece> in price(self)
     12     def price(self):
     13         # 实际价格 = 原价 * 折扣
---> 14         new_price = self.original_price * self.discount
     15         return new_price
     16

AttributeError: 'Goods' object has no attribute 'original_price'

类属性方式

创建值为 property 对象的类属性,当使用类属性的方式创建 property 属性时,旧式类 和 新式类无区别


class Foo:
    
    def get_bar(self):
        return 'get_bar'

    BAR = property(get_bar)
    
    
# ipython 测验
In [32]: f = Foo()

In [33]: f.BAR
Out[33]: 'get_bar'

f.BAR 自动调用 get_bar() 方法,并获取方法的返回值

property() 中有个四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息

class Foo(object):

    def __init__(self, bar):
        self.bar = bar
    
    def get_bar(self):
        print('get_bar')
        return self.bar

    def set_bar(self, value): 
        """必须要有两个参数"""
        print('set bar ' + value)
        self.bar = value

    def del_bar(self):
        print('del bar')
        del self.bar

    BAR = property(get_bar, set_bar, del_bar, "bar description...")

    
# ipython测验
In [50]: f = Foo('python')

In [51]: f.BAR
get_bar
Out[51]: 'python'

In [52]: f.BAR = 'Java'
set bar Java

In [53]: f.BAR
get_bar
Out[53]: 'Java'

In [54]: del f.BAR
del bar

property对象与@property装饰器对比

由于 类属性方式 创建 property 对象属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对 同一个属性:获取、修改、删除 ,跟 @property 装饰器对比。

property对象类属性


# Goods类 property对象类属性 应用

class Goods(object):

    def __init__(self, name, price):
        # 原价
        self.original_price = price

        # 折扣
        self.discount = 0.8

    def get_price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    def set_price(self, value):
        self.original_price = value

    def del_price(self):
        print('删除商品原价')
        del self.original_price

    PRICE = property(get_price, set_price, del_price, "price description")

    
# ipython测验
In [59]: g = Goods('Mac电脑', 9000)

In [60]: g.PRICE
Out[60]: 7200.0

In [61]: g.PRICE = 10000

In [62]: g.PRICE
Out[62]: 8000.0

In [63]: del g.PRICE
删除商品原价

@property装饰器


# Goods类 @property装饰器 应用

class Goods(object):

    def __init__(self, name, price):
        # 原价
        self.original_price = price

        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        print('删除商品原价')
        del self.original_price
        
        
# ipython测验
In [59]: g = Goods('Mac电脑', 9000)

In [60]: g.PRICE
Out[60]: 7200.0

In [61]: g.PRICE = 10000

In [62]: g.PRICE
Out[62]: 8000.0

In [63]: del g.PRICE
删除商品原价

可以发现两种都可以实现但 @property 装饰器的在 旧式类中只有 @property , 没有@method.setter 和

@method.deleter,新式类则两种都可以使用。因此看大家的习惯,选一种。

以上就是python property的使用技巧分享的详细内容,更多关于python property的资料请关注编程网其它相关文章!

--结束END--

本文标题: python property的使用技巧分享

本文链接: https://www.lsjlt.com/news/10561.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python中关于property使用的小技巧
    目录property属性具体实例property属性的有两种方式装饰器方式旧式类新式类类属性方式property对象与@property装饰器对比property对象类属性@prop...
    99+
    2024-04-02
  • 10个Python中Pip的使用技巧分享
    目录Python pip1.安装 pip2.升级 pip3.安装库4. 库的批量安装5.卸载和升级包6. 冻结 Python pip 依赖7.查看库信息8.查看需要升级的库9. 检查...
    99+
    2024-04-02
  • 3.python小技巧分享-使用min和
    睡前分享一个小技巧~使用min和max函数来巧妙的查找一个字典中的最大value和最小value。比如说,现在有一个字典,字典的key是用户名,value则是这个用户的账户有多少钱。现在想要找出账户内余额最多的用户,请问如何实现?d1 = ...
    99+
    2023-01-31
    小技巧 python min
  • 分享9个好用的Python技巧
    目录1.引言2.Trick 13.Trick 24.Trick35.Trick46.Trick57.Trick68.Trick79.Trick810.Trick911.总结1.引言 ...
    99+
    2024-04-02
  • MyEclipse常用的使用技巧分享
    这篇文章主要介绍“MyEclipse常用的使用技巧分享”,在日常操作中,相信很多人在MyEclipse常用的使用技巧分享问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyEclipse常用的使用技巧分享”的疑...
    99+
    2023-06-17
  • 分享9个实用的Python技巧
    本篇内容介绍了“分享9个实用的Python技巧”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!清理字符串输入对用户输入进行清理的问题几乎适用于...
    99+
    2023-06-16
  • 20个Python常用技巧分享
    目录1.字符串反转2.每个单词的第一个字母大写3. 字符串查找唯一元素4.重复打印字符串和列表n次5.列表生成6.变量交换7.字符串拆分为子字符串列表8.多个字符串组合为一...
    99+
    2023-05-14
    Python常用技巧分享 Python常用技巧 Python技巧
  • 分享MySQL中锁的使用技巧
    MySQL 锁的使用技巧分享随着数据库应用的日益广泛,对数据库的并发控制和数据完整性要求也越来越高。在MySQL数据库中,锁是一种重要的并发控制手段,可以有效地保护数据的完整性和一致性。本文将对MySQL锁的使用技巧进行详细分享,并提供具体...
    99+
    2023-12-21
    MySQL 技巧
  • 分享Python 的十个小技巧
      一. 列表、字典、集合、元组的使用  from random import randint, sample  # 列表解析  data = [randint(-10, 10) for _ in xrange(10)]  filter(l...
    99+
    2023-01-31
    小技巧 Python
  • 利用VS Code写Python的技巧分享
    本篇内容介绍了“利用VS Code写Python的技巧分享”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文基于 VS Code 1.36....
    99+
    2023-06-02
  • Python小技巧练习分享
    目录1.反转数字2.类的说明文档3.设置 Python 文件的编码4.旋转字符串5.实现控制台滚动条6.print 函数直接写入文件7.合并 2 个列表1.反转数字 问题场景: 把数...
    99+
    2024-04-02
  • vue3provide与inject的使用小技巧分享
    目录vue3 provide与inject使用技巧进入正题父组件child组件son组件vue3的一些实用技巧v-for 和 v-if 不要一起使用(Vue2)vue3 provid...
    99+
    2024-04-02
  • CSS常用的技巧分享
    这篇文章主要讲解了“CSS常用的技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS常用的技巧分享”吧!Box-sizing尽管box-sizing...
    99+
    2024-04-02
  • Pandas实用的技巧分享
    这篇文章主要讲解了“Pandas实用的技巧分享”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Pandas实用的技巧分享”吧!01 使用apply拆分文本Pandas 中 apply 函数,应...
    99+
    2023-06-15
  • 分享介绍Python的9个实用技巧
    本文会介绍一些Python大神用的贼溜的技巧,让一探究竟吧!欢迎收藏学习,喜欢点赞支持,欢迎畅聊。 整理字符串输入 整理用户输入的问题在编程过程中很常见。有更好的方法来解决: u...
    99+
    2024-04-02
  • CSS在使用中的高级技巧分享
    本篇内容主要讲解“CSS在使用中的高级技巧分享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS在使用中的高级技巧分享”吧!一、ul标签在Mozilla中默认是有padding值的,而在IE中...
    99+
    2023-06-08
  • 分享Python 加速运行技巧
    目录1.避免全局变量2.避免2.1 避免模块和函数属性访问2.2 避免类内属性访问3.避免不必要的抽象4.避免数据复制4.1 避免无意义的数据复制4.2 交换值时不使用中间变量4.3...
    99+
    2024-04-02
  • Python 并行加速技巧分享
    目录1 前言2 使用joblib进行并行计算2.1 使用Parallel与delayed进行并行加速1 前言 我们在日常使用Python进行各种数据计算处理任务时,若想要获得明显的计...
    99+
    2024-04-02
  • 分享ES6 20个经常使用技巧
    目录前言:1.打乱数组顺序2.删除数字之外的所有字符3.反转字符串或者单词4.将十进制转换为二进制文件或十六进制数5.合并多个对象6.=== 和 == ...
    99+
    2024-04-02
  • Python读取CSV数据的实用技巧分享
    python 中读取 csv 数据的方法分两种:内置 csv 模块,适用于小型 csv 文件,按行迭代数据;pandas 库,提供 read_csv() 函数,可轻松将 csv 数据加载...
    99+
    2024-04-04
    python csv
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作