返回顶部
首页 > 资讯 > 后端开发 > Python >python知识:装饰器@property到底有啥用途
  • 747
分享到

python知识:装饰器@property到底有啥用途

python装饰器python @propertypython知识 2023-01-04 12:01:30 747人浏览 泡泡鱼

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

摘要

目录一、提要二、关于属性的约定2.1 类绑定属性2.2 对象绑定属性2.3 私有属性 三、应用@property装饰器3.1 将一个属性转成方法3.2 私有化某些属性3.3

一、提要

python的@property是Python的一种装饰器,是用来修饰方法的。

python @property 装饰器使一个方法可以像属性一样被使用。

除此之外,还有几个使用场景,本文将叙述这些使用技巧。

二、关于属性的约定

首先看下属性的分类:

2.1 类绑定属性

一般类内属性是指定义成与类同一存储单元的属性,可以类访问。

而当类实例化成对象后,类变量将做为拷贝加入对象,对象所访问的属性是一份拷贝。

这份拷贝修改后易变。

验证代码

class Stranger(object):
    name = 'class name'                #类绑定属性
    def __init__(self, gender=None ):
        self.gender = gender           #对象绑定属性
        self.name = 'new name'         #对象中属性,与类属性的同名拷贝
 
stan = Stranger('male')
print(1,stan.gender)
stan.gender = 'famel'
print(2,stan.gender)
print(3 stan.name)
print( 4, Stranger.name)

结果:

1 male
2 famel
3 new name
4 class name

2.2 对象绑定属性

凡用self定义的属性,都是对象绑定属性,

  • 内部调用时都需要加上self.
  • 外部调用时用 instance_name.property_name进行访问
class Stranger(object):
    def __init__(self, gender=None ):
        self.gender = gender
 
stan = Stranger('roma')
print(stan.gender)
 
stan.gender = 'Paras'
print(stan.gender)

结果: 

roma
Paras 

注意:事实上实例化后的对象,也可以定义属性,外部也可以调用。 

2.3 私有属性 

python的私有属性没有编译限定,知识以单下划线_开头,标记此属性是私有的,但是外部也可以自由访问(私有的程度不够多)。

另一种是双下划线__开头的属性,可以转化成类属性访问

  • 单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改
  • 双下划线__开头:外部不可通过instancename.propertyname来访问或者更改,实际将其转化为了_classname__propertyname

三、应用@property装饰器

python的@property是python的一种装饰器,是用来修饰方法的。python @property 装饰器使一个方法可以像属性一样被使用,而不需要在调用的时候带上() 接下来我们会了解什么时候需要使用它,并且在什么场景下需要用到它以及如何合理的使用它。

python类中@property装饰器,相配合的方法有:

  • setter() 
  • get() 
  • set()

相配合。

3.1 将一个属性转成方法

将一个属性转化为一个方法时,我们最好加上一个@property 装饰器来解决这个问题。

在方法定义上面加一个@property 装饰器,可以在不改变原有调用方式的同时,来将一个属性改为一个方法。

class Goods():
        def __init__(self,unit_price,weight):
            self.unit_price = unit_price
            self.weight = weight
 
        @property
        def price(self):
            return self.unit_price * self.weight 
 
lemons = Goods(7,4)
print(lemons.price)

   28    

 上文中,price是方法,现在将方法转化成属性调用。注意这个技巧,要知道原类定义中无price这个属性,这是一个临时产生的结果。类同于excel表格的“计算项”。

3.2 私有化某些属性

对于某些属性,不可直接访问。这里的“直接”就是“无条件”的意思;而条件的访问,就需要装饰器 @property,下例是双装饰器@property和@age.setter配合,对_age进行条件隔离的例子:

class Stranger(object):
    def __init__(self, gender=None, age=None, job=None):
        self.gender = gender
        self._age = age # 这里的成员属性_age需要与成员方法age()区分开
        self.jobb = job
 
    # 读取age
    @property # 实现一个age相关的getter方法
    def age(self):
        return self._age
 
    # 设置age
    @age.setter # 实现一个age相关的setter方法
    def age(self, value):
        if isinstance(value, int):
            self._age = value
        else:
            raise ValueError("'int' type need")
            
 
if __name__ == "__main__":
    # 创建一个“妹子”
    meizi = Stranger()
 
    meizi.age = 18  # 使用时注意是.age,不是._age
    print("年龄:{age}".fORMat(age=meizi.age))

注意事项:

  • 属性名与方法名一定要区分开,不然会进入死循环(self._age,def age())
  • 实例化的对象使用属性时,不是调用属性(meizi._age),而是用的方法名(meizi.age)
  • @property其实就是实现了getter功能; @xxx.setter实现的是setter功能;还有一个 @xxx.deleter实现删除功能
  • 定义方法的时候 @property必须在 @xxx.setter之前,且二者修饰的方法名相同(age())
  • 如果只实现了 @property(而没有实现@xxx.setter),那么该属性为 只读属性

3.3 关联性修改

比如,我们输入了first_name、last_name可以得出fullname,下面代码可以实现全名的属性获取。而反过来,对全名进行修改后,如何将连带的first_name、last_name同步进行修改?。

下文中的 @fullname.setter就是解决此类问题的。

class Person():
    def __init__(self, first_name, last_name):
        self.first = first_name
        self.last = last_name
 
    @property
    def fullname(self):
        return self.first + ' ' + self.last
 
    @fullname.setter
    def fullname(self, name):
        first_name, last_name = name.split()
        self.first = first_name
        self.last = last_name
 
    def email(self):
        return '{}.{}@email.com'.format(self.first, self.last)
 
 
person = Person('zhang', 'san')
print(person.fullname)
print(person.last)
print(person.first)
 
person.fullname = 'li si'
print(person.fullname)
print(person.last)
print(person.first)

3.4 删除属性的deleter方法

setter 方法类似,当我们需要删除一个属性时,我们会使用deleter 方法。

你可以像定义setter 方法一样来定义一个setter 方法,使用相同的方法名,并在方法上添加@{methodname}.deleter 装饰器 。

class Person():
    def __init__(self, first_name, last_name):
        self.first = first_name
        self.last = last_name
 
    @property
    def fullname(self):
        return self.first + ' ' + self.last
 
    @fullname.setter
    def fullname(self, name):
        first_name, last_name = name.split()
        self.first = first_name
        self.last = last_name
 
    @fullname.deleter
    def fullname(self):
        self.first = None
        self.last = None
 
    def email(self):
        return '{}.{}@email.com'.format(self.first, self.last)
 
 
person = Person('zhang', 'san')
print(person.fullname)
print(person.last)
print(person.first)
 
del person.fullname
 
print(person.last)
print(person.first)

四、property()函数原理

使用该函数可以将方法直接变成属性,与@property类同。

函数接口:

property(fget=None, fset=None, fdel=None, doc=None)

使用property的代码示例:

class Stranger(object):
    def __init__(self, gender=None, age=None, job=None):
        self.gender = gender
        self._age = age
        self.jobb = job
 
    # 设置_age
    def set_age(self, age):
        if isinstance(age, int):
            self._age = age
        else:
            raise ValueError("'int' type need")
 
    # 读取_age
    def get_age(self):
        return self._age
    
    # 使得实例化对象可以利用.age方式来访问
    age = property(get_age, set_age)
 
 
if __name__ == "__main__":
    # 创建一个“妹子”
    meizi = Stranger()
 
    meizi.age = 18
    print("年龄:{age}".format(age=meizi.age))

# 输出:
#年龄:18

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: python知识:装饰器@property到底有啥用途

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

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

猜你喜欢
  • python知识:装饰器@property到底有啥用途
    目录一、提要二、关于属性的约定2.1 类绑定属性2.2 对象绑定属性2.3 私有属性 三、应用@property装饰器3.1 将一个属性转成方法3.2 私有化某些属性3.3...
    99+
    2023-01-04
    python装饰器 python @property python知识
  • Python小知识 - Python装饰器
    Python装饰器 在Python中,装饰器是一个特殊的函数,可以将其他函数包装在装饰器函数中,并且将被包装的函数作为参数传递给装饰器函数。 使用装饰器的好处是可以自动在被包装的函数前后执行一...
    99+
    2023-09-13
    Python YYDS
  • python @property 装饰器使用方法
    目录一、property的装饰器用法二、举例说明1.不用setter和getter方法的实现2.使用setter和getter的实现,增加温度值输入的限制3.利用property装饰...
    99+
    2024-04-02
  • python装饰器property和setter用法
    目录1.引子:函数也是对象2.函数内的函数3.装饰器小栗子5.property和setter用法1.引子:函数也是对象 木有括号的函数那就不是在调用。 def hi(name="ya...
    99+
    2024-04-02
  • python中@property装饰器怎么用
    这篇文章主要介绍python中@property装饰器怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、property的装饰器用法先简单上个小栗子说明:class property(fget=None,fse...
    99+
    2023-06-29
  • Python中的装饰器知识点有哪些
    这篇文章主要介绍“Python中的装饰器知识点有哪些”,在日常操作中,相信很多人在Python中的装饰器知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中的装饰器知识点有哪些”的疑惑有所...
    99+
    2023-07-02
  • python装饰器相关知识点
    小编给大家分享一下python装饰器相关知识点,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、装饰器1.相关知识点*args:负责将多余的位置实参汇总,赋值给a...
    99+
    2023-06-29
  • Python装饰器中@property使用详解
    目录最初的声明方式使用装饰器的声明方式使用装饰器的调用过程总结最初的声明方式 在没有@property修饰的情况下,需要分别声明get、set、delete函数,然后初始化prope...
    99+
    2024-04-02
  • Python装饰器的相关知识点有哪些
    这篇文章主要介绍“Python装饰器的相关知识点有哪些”,在日常操作中,相信很多人在Python装饰器的相关知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python装饰器的相关知识点有哪些”的疑...
    99+
    2023-06-25
  • Python property装饰器使用案例介绍
    目录1.property2.property属性定义的两种方式3.案例1.property 装饰器:装饰器是在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新功能的可调用...
    99+
    2024-04-02
  • python中property装饰器的使用方法
    这篇文章主要介绍python中property装饰器的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和...
    99+
    2023-06-15
  • Python Property装饰器的作用是什么
    本篇内容介绍了“Python Property装饰器的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. property装饰器的...
    99+
    2023-06-15
  • 如何在Python中使用@property装饰器
    这期内容当中小编将会给大家带来有关如何在Python中使用@property装饰器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、property() 函数讲解了解 @property 装饰器之前,我们...
    99+
    2023-06-15
  • python装饰器property和setter怎么使用
    本篇内容介绍了“python装饰器property和setter怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.引子:函数也是对象...
    99+
    2023-07-02
  • Python深入分析@property装饰器的应用
    目录什么是propertyproperty属性定义的两种方式@property属性值的限制什么是property 简单地说就是一个类里面的方法一旦被@property装饰,就可以像调...
    99+
    2024-04-02
  • Python装饰器的11个知识点分享
    本篇内容介绍了“Python装饰器的11个知识点分享”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01. Hello,装饰器装饰器的使用方法...
    99+
    2023-06-02
  • Django中的装饰器有哪些用途
    身份验证和权限控制:可以使用装饰器来验证用户身份并控制其访问权限,例如@login_required装饰器可以确保只有已登录的用...
    99+
    2024-03-05
    Django
  • 浅谈Python从全局与局部变量到装饰器的相关知识
    全局变量与局部变量 # num1是全局变量 num1 = 1 # num2是局部变量 def func(): num2 = 2 在函数外(且不在函数里)定义的变量是全局变量...
    99+
    2024-04-02
  • Python黑魔法@property装饰器的使用技巧解析
    @property有什么用呢?表面看来,就是将一个方法用属性的方式来访问. 上代码,代码最清晰了. class Circle(object): def __init__(self, rad...
    99+
    2022-06-04
    使用技巧 黑魔法 Python
  • 实例讲解Python编程中@property装饰器的用法
    取值和赋值 class Actress(): def __init__(self): self.name = 'TianXin' self.age = 5 类Actress中有...
    99+
    2022-06-04
    实例 Python property
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作