Python属性(@property)
创建用于计算机的属性
在Python中,可以通过@property
(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。
通过@property
创建用于计算的属性的语法如下:
class Demo:
@property
def methodname(self):
block # 方法体
- methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
- self:必要参数,表示类的示例。
- block:方法体,实现的具体功能。在方法体中,通常以
return
语句结束,用于返回计算结果。
示例1:
定义一个矩形类,在__init__()
方法中定义两个实例属性,然后在定义一个计算矩形面积的方法,并应用@property
将其转换为属性,最后创建类的实例,并访问转换后的属性:
class Rect:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rect(800, 600)
print('面积为:', rect.area) #输出属性的值,因为使用到了装饰器这里调用area就不需要在最后加一个括号了(rect.area())
执行结果:
面积为: 480000
注意:
通过@property
转换后的属性不能重新赋值,如果对其重新赋值,将会抛出异常。
示例代码:
class Rect:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rect(800, 600)
rect.area = 2 # <---------------在这里进行了重新赋值
print('面积为:', rect.area) # 应为使用到了装饰器这里调用area就不需要在最后加一个括号了(rect.area)
执行结果:
Traceback (most recent call last):
File "D:/xuexi/python/Demo.py", line 14, in <module>
rect.area = 2
AttributeError: can't set attribute
为属性添加安全保护机制
在Python中,默认情况下,创建的类属性或者实例是可以在类外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取他的值。如果想要创建一个可以读但不能修改的属性,那么也可以使用
@property
实现只读属性。
示例代码:
class Demo:
def __init__(self, one):
self.__one = one
@property
def demo1(self):
return self.__one
test = Demo(1)
test.demo1 = 2 # 直接对方法进行重新赋值
print('面积为:', test.demo1)
执行结果:
Traceback (most recent call last):
File "D:/xuexi/python/Demo.py", line 11, in <module>
test.demo1 = 2
AttributeError: can't set attribute
可以看到我们打算对 demo1 重新赋值但报错了,当我们使用了@property
后外部就不能对我们的方法(函数)进行修改了。
总结: 使用@property
后属性访问时不能对其进行修改,访问使用了@property
的属性(方法/函数)不需要在后面加括号“()”。
通过@property
转换后可以修改的方法:
使用 @xxx.setter方法,让属性可修改
示例代码:
class TVshow: # 定义电视节目类
list_film = ["战狼2", "红海行动", "西游记女儿国", "熊出没·变形记"]
def __init__(self, show):
self.__show = show
@property # 将方法转换为属性
def show(self): # 定义show()方法 # 1
return self.__show # 返回私有属性的值
@show.setter # 给show设置setter方法,让属性可修改
def show(self, value): # 2
"""此函数也包含上面的这个show(# 1)的功能,如果出现重新赋值,将调用# 1 将结果返回"""
if value in TVshow.list_film: # 判断值是否在列表中
self.__show = "您选择了《" + value + "》,稍后将播放" # 返回修改的值
else:
self.__show = "您点播的电影不存在"
tvshow = TVshow("战狼2") # 创建类的实例
print("正在播放:《", tvshow.show, "》") # 获取属性值
print("您可以从", tvshow.list_film, "中选择要点播放的电影")
tvshow.show = "红海行动" # 修改属性值
print(tvshow.show) # 获取属性值
执行结果:
正在播放:《 战狼2 》
您可以从 ['战狼2', '红海行动', '西游记女儿国', '熊出没·变形记'] 中选择要点播放的电影
您选择了《红海行动》,稍后将播放
如果直接创建实例传入参将会执行# 1
这个属性,如果重新赋值就会访问到下面可修改的# 2
这个属性。
Python属性(@property)的更多相关文章
- python 属性 property、getattr()、setattr()详解
直奔主题 使用中文注释需要使用 #-*-coding:utf-8-*- property property在python中有2中使用property方法:1.@property @属性名称.sette ...
- Python: 浅淡Python中的属性(property)
起源:项目过程中需要研究youtube_dl这个开源组件,翻阅其中对类的使用,对比c#及Delphi中实现,感觉Python属性机制挺有意思.区别与高级编程语言之单一入口,在类之属性这一方面,它随意的 ...
- day26 python学习 对象的接口,封装,私用属性 property
# 抽象类和接口类 #** #不崇尚接口类 #python本身支持多继承,没有接口专用的语法.但是我知道接口的概念 # 接口类:# 是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现# 接口 ...
- python 中 property 属性的讲解及应用
Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 1. 装饰器 即:在方法上应用装饰器 2. 类属性 即 ...
- python的property属性
最近看书中关于Python的property()内建函数属性内容时<python核心编程>解释的生僻难懂,但在网上看到了一篇关于property属性非常好的译文介绍. http://pyt ...
- 【转】python之property属性
1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ############### class Foo: def ...
- Python——私有化 和 属性property
Python——私有化 和 属性property 一.私有化 xx: 公有变量 _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问 ...
- python中property属性的介绍及其应用
Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...
- 第7.23节 Python使用property函数定义属性简化属性访问的代码实现
第7.23节 Python使用property函数定义属性简化属性访问的代码实现 一. 背景 在本章前面章节中,我们介绍了类相关的知识,并举例进行了说明,在这些例子中会定义一些形如 ...
随机推荐
- 《SSH网上商城》-视频目录--代码可以跑起来
本课程是2015年2月份的,就是14年底的. 课程第一天的代码-添加 jsp-api.jar servlet-api.jar就可以跑起来,环境 JDK1.7 和tomcat8, SSH网上商城\S ...
- python初级实战-----主机在线情况监控web
背景 公司有600多台服务器,打算写一个小程序,能一眼看见哪些服务器不在线. 大体思路是: 1.把所有服务器ip存进数据库,ping命令判断服务器是否在线 2.更新数据库中ip的状态 3.简单的web ...
- python 三大框架之一Flask入门
Flask轻量级框架,Flask是python中的轻量级框架. 打开终端 输入pip install Flask 命令 下载以及安装Flask框架 检查是否下载成功及能否使用 首先导入python环境 ...
- pythonのpygame安装
本地环境: python 3.7.0 windows7 64bit pip pygame地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame 通 ...
- 应急响应-GHO提取注册表快照
前言 备份文件.gho中找到机器的注册表 文件夹位置 在 C:\WINDOWS\SYSTEM32\CONFIG 下就是系统的注册表,一般情况下,这里面会有以下几个文件: default 默认注册表文件 ...
- Faster_RCNN 3.模型准备(下)
总结自论文:Faster_RCNN,与Pytorch代码: 本文主要介绍代码第二部分:model/ , 首先分析一些主要理论操作,然后在代码分析里详细介绍其具体实现. 首先在参考文章的基础上进一步详细 ...
- python3+requests库框架设计03-请求重新封装
在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下. 具体怎么封装还是要看被测 ...
- 题解-AtCoder-agc006C Rabbit Exercise
Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...
- 【转】判断处理器是Big_endian的还是Little_endian的
首先说明一下Little_endian和Big_endian是怎么回事. Little_endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big_endian模式则是从高字节到低字节,比 ...
- 004_为什么不推荐APP使用SSL-PINNING
背景 之前工作的经历,前面技术团队的APP使用了SSL-PINNING,服务器SSL证书到期前,测试环境更换证书,在更换配置OK后,发现APP停止服务了.所有的请求全部都失败. 后来查到是APP使用了 ...