iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中的property及属性与特性之间的优先权
  • 158
分享到

python中的property及属性与特性之间的优先权

2024-04-02 19:04:59 158人浏览 独家记忆

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

摘要

目录 前言属性(attribute)属性的定义属性的用法特性(property)特性的定义特性的用法特性的使用场景属性和特性之间的差别和联系属性和特性之间的优先权 

 前言

这几天看《流畅的python》这本书了,在一个示例中又看到了property作为装饰器在使用,因为很久没有用这个东西了,对它的一些特性和使用方法等都不是很熟悉,所以又专门在搜了几篇博客和在官方文档中学习了它的相关用法。再者又刚好学到了Python中的属性(attribute),所以刚好这两者可以两相对比,也许更好理解!

属性(attribute)

属性的定义

在python中,属性其实是(对象的)属性和(对象的)方法的集合。

一开始我以为就是:属性就是属性,方法就是方法,一个是“属性”,一个是行为,但是在打开IDE写了一个测试案例后,我就信服了:

# python中数据的属性和处理数据的方法统称为属性
class Cat:

    def __init__(self, name):
        self.name = name

    def run(self):
        print('小碎步...')

if __name__ == '__main__':
    tom = Cat('Tom')
    print(tom.__getattribute__('name'))  # 对象的属性
    print(tom.__getattribute__('run'))  # 对象的方法

在这里我定义了一个类,同时在初始化方法中为它添加了一个属性name,然后定义了一个run方法,之后在main方法里创建了tom这个实例,使用__getattribute__()方法来获取它的name属性和run属性,果不其然,居然真的都获取到了!

 所以,以后再也不要说属性只是单纯的“属性”了!

属性的用法

属性用法很简单,不管是对象的属性还是方法,都是用.来获取或者调用。

1.设置或修改对象的属性

tom.name='Tom' #设置(修改)对象tom的name属性值为Tom

2.删除对象的属性

del tom.name #使用del关键字删除对象的属性

 可以看到,属性删除后就不能再获取了。

3.调用对象的方法(属性)

tom.run() #直接用.调用即可

4.对象的方法置None

对象的方法我们无法删除,但是我们可以将其置为None。

tom.run=None

特性(property)

特性的定义

个人理解:特性就是属性的特例,因为预先知道某些属性的一些特定条件,比如取值范围,类型等等,所以在对这些属性进行操作的时候,为了在操作前后,保持一些特定条件不变(就是不准越界操作),所以就有了特性来约束它。

来看一下官方文档给的例子:

官方文档中提到:一个典型的例子就是托管x(这里的x是一个类的属性), 使用方法也特别的直接明了:如果 c 为 C 的实例,c.x 将调用 getter,c.x = value 将调用 setter, del c.x 将调用 deleter。就是在对c.x这个属性进行操作时,可以通过getter,setter,delx来控制它的修改和删除。

特性的用法

因为它是一个修饰器,所以调用方法有两种:

1.直接使用@符号调用

class Dog:
 
    def __init__(self):
        self.__name = None
 
    @property
    def name(self):
        print('调用了get_name方法...')
        return self.__name
    @name.setter
    def name(self, val):
        print('调用了set_name方法...')
        self.__name = val
    @name.deleter
    def name(self):
        print('调用了del_name方法...')
        del self.__name
if __name__ == '__main__':
    tom = Dog()
    tom.name = 'Tom'
    print(tom.name)
    del tom.name

2.当做一个正常的函数使用

class Cat:
    def __init__(self):
        self.__name = None
    def set_name(self, name):
        print('调用了set_name方法...')
        self.__name = name
 
    def get_name(self):
        print('调用了get_name方法...')
 
        return self.__name
 
    def del_name(self):
        print('调用了del_name方法...')
        del self.__name
    name = property(get_name, set_name, del_name, 'this is a property name.')
if __name__ == '__main__':
    tom = Cat()
    tom.name = 'Tom'
    print(tom.name)
    del tom.name

可以看到两种方法使用的效果都是一样的!

特性的使用场景

重点讲一下这个,正是因为有一些特定场景的存在,才会出现property这个特性的,正如之前在《Django企业开发实战》一书中所说的那样:若无必要,勿增实体。而python向来以简洁优雅著称,因为这些特定场景,所以是有必要增加property这个实体的。

主要使用场景有两个:

1.限制一些属性为只读

 在只使用@property修饰某个方法后,将其变成特定的属性,如果不添加setter和deleter方法,那么它就变成了只读属性。比如:用户名设置后就不允许修改:

class User:

    def __init__(self, username, passWord):
        self.__username = username
        self.password = password

    # 将username属性限定为只读
    @property
    def username(self):
        return self.__username
if __name__ == '__main__':
    tom=User('tom','1234')
    print(tom.username)
    tom.username='Tom'

可以看到在只读状态下,修改和删除属性都会失败!

2.限定属性的操作范围

生活中,你可能会遇到这样的情况,有一天你告诉你妈你想吃鱼,并且是红烧鱼而不是清蒸鱼,然后你妈命令你爸去买鱼,同时你妈嘱咐你爸说:买新鲜一点的啊,价格贵一点没关系!然后你爸心想:这个月工资还没发呢,能省省就省省吧,于是你爸在心中就大概确定了买一条鱼的开销区间(比如30到100)。可以看到在一条鱼上餐桌之前,你和你爸妈是对它进行了精挑细选,才得以上到你的餐桌,其实就是对鱼这个属性增加了一些条件限定:类型的限定:要红烧的而不是清蒸的;取值范围的限定:不能太贵也不能太便宜,30到100之前刚刚好。

接下来用代码实现一下这个栗子:

class Fish:
 
    def __init__(self):
        self.__price = None
        self.__cook = None
    @property
    def price(self):
        return self.__price
    @price.setter
    def price(self, pri):
 
        if not isinstance(pri, int):
            raise ValueError('价格有误!')
        if pri < 30:
            raise ValueError('太便宜了,不要!')
        elif pri > 100:
            raise ValueError('太贵了,不要!')
        else:
            self.__price = pri
            print('价格刚刚好!')
    @property
    def cook(self):
        return self.__price
 
    @cook.setter
    def cook(self,method):
 
        if method!='红烧':
            raise ValueError('我只要红烧鱼!')
        else:
            print('耶,我最爱的红烧鱼!')
if __name__ == '__main__':
    luck_fish=Fish()
    luck_fish.price=60
    # luck_fish.cook='清蒸'
    luck_fish.cook='红烧'

可以看到,只有当属性的取值返回和类型是规定的范围之内的时候,程序才会正常执行,而生活中类似这样的栗子很多,所以这也是特性存在的意义。 

属性和特性之间的差别和联系

直观的看,特性的目的好像是把方法“属性化”,但这样做一点意义也没有,如果我可以定义一个属性,何必再额外定义一个方法,然后将其转化成属性呢?所以,更重要的目的就是应对一些特定场景。

从特性表现出来的性质和行为来看,它其实就是一种特定的“属性”。只不过特性的权利提升了一点点,就好像你可以去修改这个属性,但是能不能修改成功,就看你的上一级允不允许你修改(有没有给你这个属性添加限定条件),而特性的权利就扩展到了这个“上一级”。

属性和特性之间的优先权

在写程序的时候,也不乏会出现这样的例子:属性和特性之间重名了!那么这个时候在使用这个重名的属性(特性)时,程序是会报错?还是会使用属性的值?还是会使用特性的值?也许根据它们的名称就可以猜出来,特性嘛,肯定就特别一些嘛,所以会优先使用特性的值!下面这个栗子完美说明:

# 关系:在同名的情况下,实例属性会覆盖类属性,特性会覆盖实例属性
 
class Cat:
    @property
    def wow(self):
        return 'property---喵~'
if __name__ == '__main__':
    # 实例属性会覆盖类属性
    jerry = Cat()
 
    # 特性会覆盖实例属性
    print(jerry.__dict__)  # 查看对象的属性字典
    jerry.__dict__['wow'] = 'nORMal---喵~'
    print(jerry.__dict__)
    print(jerry.wow)  # 虽然修改了jerry的wow的值,但是依旧返回的是其特性的值
    print(jerry.__dict__['wow'])
    del Cat.wow  # 删除类特性后,返回的就是正常的属性值
    # del Cat.wow  # 删除特性
    print(jerry.wow)
    Cat.wow = property(lambda self: 'add a property---喵~')  # 为类新增和属性同名的特性
    print(jerry.wow)  # 之后还是优先访问特性的值

到此这篇关于python中的property及属性与特性之间的优先权的文章就介绍到这了,更多相关python property 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中的property及属性与特性之间的优先权

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

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

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

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

下载Word文档
猜你喜欢
  • python中的property及属性与特性之间的优先权
    目录 前言属性(attribute)属性的定义属性的用法特性(property)特性的定义特性的用法特性的使用场景属性和特性之间的差别和联系属性和特性之间的优先权 ...
    99+
    2024-04-02
  • Python中实例属性的优先级
    Python中实例属性的优先级?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该...
    99+
    2023-06-14
  • Python中property属性的用处详解
    目录前言限制值使用 @property 的方式代替。动态属性的好处动态显示附:用property代替getter和setter方法总结前言 Python 动态属性的概念可能会被面试问...
    99+
    2024-04-02
  • Python中property属性的作用是什么
    本篇内容主要讲解“Python中property属性的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中property属性的作用是什么”吧!前言Python 动态属性的概念...
    99+
    2023-06-30
  • 如何理解CSS编写中的属性优先级
    今天就跟大家聊聊有关如何理解CSS编写中的属性优先级,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当你将一个样式添加到元素上却发现不起作用时,那就是...
    99+
    2024-04-02
  • PHP 函数的安全性与代码的可读性和可维护性之间的权衡
    php 函数安全的权衡:安全性优先:设计函数时,安全应为首要考虑因素,所有输入应经过验证。可读性权衡:虽然安全重要,但代码的可读性和可维护性也不容忽视,可考虑使用简化逻辑。实际应用:在处...
    99+
    2024-04-25
    代码质量 代码安全 敏感数据 代码可读性 lsp
  • PHP5与PHP8:新特性和升级之间的差距
    PHP是一种广泛使用的服务器端脚本语言,用于开发Web应用程序。它已经演变了多个版本,每个版本都带来了新的特性和改进。PHP5和PHP8是两个重要的版本,它们之间有着较大的差距。本文将对这两个版本之间的新特性和升级差距进行探讨。...
    99+
    2024-01-26
    PHP 特性差距
  • Java中使用stream流进行List对象的特定属性合并另一属性(包括单个属性以及两个属性的合并求和以及没有属性的合并求和)
    声明:代码段仅用来表达含义,如有不标准的地方请见谅。 首先建立一个测试类: @Data@AllArgsConstructor@NoArgsConstructorpublic class Person { //id private...
    99+
    2023-09-02
    java 开发语言
  • 【Java探索之旅】我与Java的初相识(一):Java的特性与优点及其发展史
    🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 一. Java语言概述与优势1.1 J...
    99+
    2023-12-22
    java 开发语言
  • 深入浅析Java8中日期与时间的特性
    深入浅析Java8中日期与时间的特性?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。日期是商业逻辑计算一个关键的部分,任何企业应用程序都需要处理时间问题。应用程序...
    99+
    2023-05-31
    java8 ava 中日
  • Python中类的属性、方法及内置方法
    成员变量 对象的创建 创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性对象聚丙属性和方法, 句柄用于区分不同的对象, 对象的属性和方法,与类中的成员变量和成员函数对应, obj = MyClass()创建类的一个实例,扩...
    99+
    2023-01-31
    方法 属性 Python
  • HTML中id和class属性之间的区别有哪些
    这篇文章主要为大家展示了HTML中id和class属性之间的区别有哪些,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“HTML中id和...
    99+
    2024-04-02
  • css中word-spacing属性如何改变字之间的标准间隔
    这篇文章主要为大家展示了“css中word-spacing属性如何改变字之间的标准间隔”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中word-spaci...
    99+
    2024-04-02
  • margin和padding属性中四个值的先后顺序及区别是什么
    本篇文章为大家展示了margin和padding属性中四个值的先后顺序及区别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你对margin和padding中四...
    99+
    2024-04-02
  • JS中构造函数的基本特性与优缺点
    构造函数:如用函数用来初始化(使用new运算符)一个新建的对象,我们称之为构造函数(constructor) function Person(){ this.name = "...
    99+
    2024-04-02
  • Python GIL与多线程编程的性能优化之道
    1. Python GIL 简介 Python GIL(全局解释器锁)是Python解释器的核心机制,它确保同一时刻只有一个线程在执行Python字节码。这是因为Python解释器是一个单线程的解释器,它一次只能执行一条指令。GIL的作...
    99+
    2024-02-26
    Python、GIL、多线程、性能优化、GIL竞争
  • 如何剖析Margin和Padding属性中四个值的先后顺序及区别
    今天就跟大家聊聊有关如何剖析Margin和Padding属性中四个值的先后顺序及区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Margin和Pa...
    99+
    2024-04-02
  • python中递归函数与匿名函数的特性
    这篇文章主要介绍“python中递归函数与匿名函数的特性”,在日常操作中,相信很多人在python中递归函数与匿名函数的特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中递归函数与匿名函数的特性...
    99+
    2023-06-02
  • 分而治之:Oracle 18c及12.2分区新特性的N种优化实践
    本文根据杨廷琨2018年5月11日在【第九届中国数据库技术大会】上的演讲内容整理而成。   讲师介绍:   杨廷琨,高级咨询顾问, ITPUB Oracle 数据库管理版版主 ,人称...
    99+
    2024-04-02
  • Python中的文件与文件对象有哪些属性
    今天小编给大家分享一下Python中的文件与文件对象有哪些属性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 文件'...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作