Python的@property是干嘛的?| Python 主题月

简介: Python的@property是干嘛的?| Python 主题月

网络异常,图片无法展示
|



通常,当我们需要对对象的敏感属性或者不希望外部直接访问的属性进行私有化,但是某些时候我们又需要对这些私有属性进行修改,该怎么处理呢?


1、几个概念


  • _a(前置单下划线),这种属性仅表示约定的私有,非真正的私有。
  • __a(前置双下划线),这种属性表示私有,无法在外部访问。
  • _a_(前后双下划线),这种属性标识系统属性。(可选)
  • a_(后置单下划线),这种属性是为了避免和保留关键字冲突。(可选)


2、举个例子


定义一个类:


class Student(object):
    _sex='male'
    __age=0
复制代码


执行:(私有属性无法在外部访问)


>>> stu = Student()
>>> stu._sex
'male'
>>> stu.__age
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__age'
>>>
复制代码


3、解决问题


从上面的类中我们可以看到,私有属性无法在类实例中访问,怎么办呢?当我们需要对类的私有属性__age进行查询和修改的时候,我们可以定义get_age和set_age去实现。


class Student(object):
    _sex='male'
    __age=0
    def get_age(self):
        return self.__age
    def set_age(self,age):
        self.__age = age
复制代码


执行:


>>> stu = Student()
>>> stu.get_age()   
0
>>> stu.set_age(18) 
>>> stu.get_age()   
18
>>>
复制代码


4、换个方法


但是上面的这种方式略显复杂,如果在私有属性较多的类中就不太适用了,所以我们期望寻求一种更简单的方式去解决这个问题,比如将这个私有属性转化为另一个属性。告诉你个好消息,Python已经帮我们实现了,这就是@property。


class Student(object):
    _sex='male'
    __age=0
    def get_age(self):
        return self.__age
    def set_age(self,age):
        self.__age = age
    @property
    def age(self):
        return self.__age
复制代码


执行:


>>> from payhlib import Student
>>> s = Student()
>>> s.age
0
>>> s.set_age(19)
>>> s.age
19
>>
复制代码


在上面我们将__age私有属性转换为了age属性,你可能会想,既然私有属性转换为了属性,那我们是不是可以直接修改它呢?答案是不行,因为property虽然将__age转换为了属性,但是其不具备setter功能,需要我们去添加。


>>> from payhlib import Student
>>> s = Student()
>>> s.age  
0
>>> s.age=20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>
复制代码


添加setter方法



class Student(object):
    _sex='male'
    __age=0
    def get_age(self):
        return self.__age
    def set_age(self,age):
        self.__age = age
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        self.__age=value
复制代码


执行:


>>> from payhlib import Student
>>> s = Student()
>>> s.age
0
>>> s.age=20
>>> s.age    
20
>>>
复制代码


到此,@peoperty分享完毕,关于它的实现原理你可以查看源码进行研究。 图片

相关文章
|
6月前
|
数据采集 自然语言处理 算法
如何使用Python的Gensim库进行自然语言处理和主题建模?
使用Gensim库进行Python自然语言处理和主题建模,包括:1) 安装Gensim;2) 导入`corpora`, `models`, `nltk`等相关模块;3) 对文本数据进行预处理,如分词和去除停用词;4) 创建字典和语料库;5) 使用LDA算法训练模型;6) 查看每个主题的主要关键词。代码示例展示了从数据预处理到主题提取的完整流程。
162 3
|
6月前
|
存储 Python
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
Python 的其他主题:解释 Python 中的命名空间(Namespace)是什么?
69 2
|
6月前
|
Python
Python 的其他主题:什么是 Duck Typing?Python 中如何使用 Duck Typing?
Python 的其他主题:什么是 Duck Typing?Python 中如何使用 Duck Typing?
50 0
|
6月前
|
消息中间件 NoSQL 调度
学Python的别告诉我你还不造celery是干嘛的
​写python的别告诉我你还不造celery干嘛的。Celery是一个简单、灵活且可靠的分布式任务队列系统,用于处理大量消息,提供实时处理,以及异步任务执行。其核心原理包括任务队列、消息传递、任务调度和任务执行。
|
3月前
|
C++ Python
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
24 1
|
3月前
|
安全 Python
【Python】@property用法简述
【Python】@property用法简述
|
4月前
|
数据采集 自然语言处理 大数据
​「Python大数据」LDA主题分析模型
使用Python进行文本聚类,流程包括读取VOC数据、jieba分词、去除停用词,应用LDA模型(n_components=5)进行主题分析,并通过pyLDAvis生成可视化HTML。关键代码涉及数据预处理、CountVectorizer、LatentDirichletAllocation以及HTML文件的本地化处理。停用词和业务术语列表用于优化分词效果。
216 0
​「Python大数据」LDA主题分析模型
|
6月前
|
Python
Python 的其他主题:Python 中的 `__init__.py` 文件有什么作用?
Python 的其他主题:Python 中的 `__init__.py` 文件有什么作用?
75 1
|
6月前
|
开发工具 Python
国外的大学图书馆也像国内的一样吗?用Python脚本抓取期刊的主题标题!
国外的大学图书馆也像国内的一样吗?用Python脚本抓取期刊的主题标题!
|
6月前
|
自然语言处理 数据可视化 算法
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集
Python主题建模LDA模型、t-SNE 降维聚类、词云可视化文本挖掘新闻组数据集