前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中的property类和@property装饰器

Python中的property类和@property装饰器

作者头像
Python碎片公众号
发布于 2021-02-26 06:49:21
发布于 2021-02-26 06:49:21
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法。

如果我们需要访问私有属性和私有方法,可以用包含get/set的方法来间接访问。

如果要避免脏数据的出现,隐藏方法实现细节,保证数据的安全性,我们可以在包含get/set的方法中添加一些验证和干扰的代码。

参考:Python类中的私有属性和私有方法

get/set是通过方法的方式来间接访问属性和方法,接下来我们介绍通过属性的方式来访问属性和方法:property。

一、property类的使用

property的中文意义就是属性、性质,在python中主要用来为属性操作提供便利。

在Python中,提供了一个叫做property的类,通过创建property类的对象,来将私有属性设置成普通的属性,可以不再使用属性的get方法的调用方式,而像普通的公有属性一样去使用属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class City(object):
 
    def __init__(self):
        self.__name = 'SZ'
        self.__person = 1000000
 
    def __get_name(self):
        return self.__name
 
    def __set_person(self, person):
        if isinstance(person, int):
            if person > 1000000:
                self.__person = person
            else:
                print('输入的人数错误!')
        else:
            print("人数是正整数!")
 
    def __get_person(self):
        return self.__person
 
    # 通过创建property的对象,将私有方法变成一个属性给外部访问
    name = property(__get_name)
    # 通过创建property的对象,将私有属性变成外部可以访问和修改该的属性
    person = property(__get_person, __set_person)
 
 
c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = 'GZ'
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SZ
1000000
SZ
100000000

property是一个类,__init__方法由四个参数组成(可点击进入源码查看),实例化后返回一个用来操作属性的对象

参数一:属性的获取方法,参数二:属性的设置方法,参数三:属性的删除方法,参数四:属性的描述

通过property类实例对象以后,在使用对象中的属性时,就可以像使用普通公有属性一样来调用。

但是实际调用的还是set/get方法,如上面的name没有set方法,所以不能修改值。

在实例property对象时,不是所有的参数都需要写,比如示例中的name只提供了get方法,person只提供了get方法和set方法,并且都是私有的方法(property里也可以传入普通方法)。这样就完全隐藏了内部的实现细节。

二、@property装饰器的使用

Python语法中,装饰器的作用是提供装饰的功能,在不改变原来函数功能的基础上,添加新的功能。

这种形式被称为语法糖。语法糖指那些没有给计算机语言添加新功能,而只是对程序员来说更好用的语法。

利用@property装饰器,可以用来简化使用property类的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class City(object):
 
    def __init__(self):
        self.__name = 'SZ'
        self.__person = 1000000
 
    @property
    def name(self):
        return self.__name
 
    @property
    def person(self):
        return self.__person
 
    @person.setter
    def person(self, person):
        if isinstance(person, int):
            if person > 1000000:
                self.__person = person
            else:
                print('输入的人数错误!')
        else:
            print("人数是正整数!")
 
 
c = City()
print(c.name)
print(c.person)
# name属性没有写set的相关方法,所以property对象属性在外部不能修改
# c.name = 'GZ'
print(c.name)
c.person = 100000000
print(c.person)

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SZ
1000000
SZ
100000000

通过@property装饰器的方式,可以替换property类的方法,使用起来更简单。

注意:

1.在使用@property装饰属性时,只能装饰获取方法(获取属性的方法)。

2.@property装饰属性时,set/get方法不需要在属性名前加set和get,直接写属性名即可。

3.如果一个属性同时有set/get方法,那么要先实现@property对获取方法的定义,再实现设置方法的定义,定义set方法时使用 @xxx.setter装饰,xxx要和获取方法名保持一致。如:上面的person获取方法被@property装饰,person设置方法被 @person.setter装饰。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档