@property的使用
文章目录
- 前言
- 普通示例
- 对属性赋值进行约束
- @property的使用
- @property原理
前言
手机QQ有一个根据条件查找陌生人的功能。我初中时挺爱玩儿的,也因此在好友列表里添加了不少女生,相隔十年,我不得不感谢当时做出英明决定的自己,因为现在浏览空间总能看到大量的美女自拍,爽歪歪……
……咳咳!不扯了,进入正题。
普通示例
既然我们要查找符合条件的陌生人,那当然得先构建一个具有这样条件的人出来,再去数据库中匹配真实用户。为了简便,这里我就只用到性别,年龄,职业。
根据要求,完成代码还不“洒洒水”呀!
class Stranger(object):def __init__(self, gender=None, age=None, job=None):self.gender = genderself.age = ageself.jobb = jobif __name__ == "__main__":# 创建一个“妹子”meizi = Stranger()# 设置妹子的属性meizi.gender = "female"meizi.age = 18meizi.job = "teacher"# 访问妹子的属性print("妹子信息:")print("性别:{gender}".format(gender=meizi.gender))print("年龄:{age}".format(age=meizi.age))print("职业:{job}".format(job=meizi.job))# 输出:
#妹子信息:
#性别:female
#年龄:18
#职业:teacher
但是不对,因为如上我们定义的Stranger类,实例化出来的对象meizi还可以这样用:
# ...if __name__ == "__main__":# 创建一个“妹子”meizi = Stranger()# 设置妹子的属性meizi.gender = "beijing"meizi.age = "teacher"meizi.job = 20# 访问妹子的属性print("妹子信息:")print("性别:{gender}".format(gender=meizi.gender))print("年龄:{age}".format(age=meizi.age))print("职业:{job}".format(job=meizi.job))# 输出:
#妹子信息:
#性别:beijing
#年龄:teacher
#职业:20
程序没有报异常,但输出结果乱了套。 怎么性别变beijing、年龄变teacher呢?
对属性赋值进行约束
这是因为我们没有对属性gender,age,job加以限制,所以可以被用户任意赋值。要约束自然不难,这里单拿属性age作说明:
class Stranger(object):def __init__(self, gender=None, age=None, job=None):self.gender = genderself.age = ageself.jobb = job# 设置agedef set_age(self, age):if isinstance(age, int):self.age = ageelse:raise ValueError("'int' type need")# 读取agedef get_age(self):return self.ageif __name__ == "__main__":# 创建一个“妹子”meizi = Stranger()meizi.set_age(18)print("年龄:{age}".format(age=meizi.get_age()))# 输出:
#年龄:18
如果此时我们做这样的操作:
meizi.set_age("teacher")print("年龄:{age}".format(age=meizi.get_age()))
程序会抛异常ValueError: 'int' type need
我们的确实现了预期的目的,但是设置age需要执行meizi.set_age("teacher")
,访问age需要meizi.get_age()
,是不是变麻烦呢?
@property的使用
为了避免麻烦,于是有了@property装饰器。它的作用是:将方法变成属性调用。使用示例如下:
class Stranger(object):def __init__(self, gender=None, age=None, job=None):self.gender = genderself._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 = valueelse:raise ValueError("'int' type need")if __name__ == "__main__":# 创建一个“妹子”meizi = Stranger()meizi.age = 18 # 使用时注意是.age,不是._ageprint("年龄:{age}".format(age=meizi.age))# 输出:
#年龄:18
注意事项:
- 属性名与方法名一定要区分开,不然会进入死循环(
self._age
,def age()
) - 实例化的对象使用属性时,不是调用属性(
meizi._age
),而是用的方法名(meizi.age
) - @property其实就是实现了getter功能; @xxx.setter实现的是setter功能;还有一个 @xxx.deleter实现删除功能
- 定义方法的时候 @property必须在 @xxx.setter之前,且二者修饰的方法名相同(
age()
) - 如果只实现了 @property(而没有实现@xxx.setter),那么该属性为 只读属性
@property原理
函数接口:property(fget=None, fset=None, fdel=None, doc=None)
使用:
class Stranger(object):def __init__(self, gender=None, age=None, job=None):self.gender = genderself._age = ageself.jobb = job# 设置_agedef set_age(self, age):if isinstance(age, int):self._age = ageelse:raise ValueError("'int' type need")# 读取_agedef get_age(self):return self._age# 使得实例化对象可以利用.age方式来访问age = property(get_age, set_age)if __name__ == "__main__":# 创建一个“妹子”meizi = Stranger()meizi.age = 18print("年龄:{age}".format(age=meizi.age))# 输出:
#年龄:18
@property的使用相关推荐
- redisson get()数据报错,missing type id property ‘@class’
redisson get()数据报错: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when ...
- Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常
kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...
- kotlin Bean加载失败lateinit property has not been initialized
Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...
- python 创建只读的函数(@property的介绍与使用)
@property 介绍 @property 是python 中的修饰符,将方法转为属性,可以直接通过方法名来访问,注意访问的时候后面不需要添加小括号,否则会报错,作用是将函数变为只读的,不能修改,否 ...
- Android 属性动画(Property Animation) ObjectAnimator的介绍
先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...
- Android 属性动画(Property Animation) ValueAnimator 的介绍
先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...
- java property异常_Java常见的异常和解决的办法
Java程序设计中我们经常会遇到异常,遇到异常不要浮躁,找到问题的原因解决是很容易的.我们整理了一些异常和解决的方法供大家参考. 1.java.lang.IllegalStateException: ...
- 1-runtime的Method,IMP,Property,ivar
基础定义 objc-750 的tar包 objc-private.h 定义 typedef struct objc_class *Class; typedef struct objc_object * ...
- python中的类的成员变量以及property函数
1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用"类."来引用 ...
- 定义一个属性_Python property属性
1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ###############class Foo: def ...
最新文章
- Python3.5源码分析-List概述
- linux postgres用户,关于linux:在启动时创建postgres用户
- c语言数据类型_C语言基础数据类型
- 后盾网php多少钱_商标转让做公证花多少钱-购店网
- vue 切换页面没有改变滚动条_Web前端高级Vue学习笔记(三)
- 【bzoj 3595】: [Scoi2014]方伯伯的Oj
- Jquery遮罩插件,想罩哪就罩哪!
- Git常用的步骤和命令
- Java反射机制总结(实例分析)(一)
- 并发(concurrent)、并行(parallel)、顺序(sequential)、串行(serial)是什么 区别
- 基于内容的视频搜索引擎
- SpringBoot+Vue+Cas单点登录与登出
- 网页设计Dreamweaver【2】
- vue实现刷新页面,页面回到顶部
- 标准成本还是实际成本 成本核算标准选择
- Kali Linux学习笔记—无线渗透 WPA攻击(PSK破解、AIROLIB、JTR、cowpatty、pyrit)
- 电脑重装系统数据恢复方法教程
- PHP自学笔记 | phpmyadmin无法访问——开放888端口
- 计算机自我鉴定高中生200字,高中生毕业自我鉴定200字
- 模拟语音交换机和IP电话系统的互联互通
热门文章
- medsem-中介效应:基于结构方程模型SEM的中介效应分析
- JAVA 使用aspose.cad将dwg文件转PDF(每个布局转为一页)
- 服务器监控系统应有哪些功能,公安视频监控系统需要具备哪些功能
- 微信小程序与普通网页区别
- 快捷连接 残差_残差网络解决了什么问题
- 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
- 静态类型语言、动态类型语言、强类型定义语言、弱类型定义语言、编译型语言、解释型语言...
- 苹果电池显示维修_iFixit拆解苹果iPhone 12/Pro:显示屏和电池可互换
- 人工智能商业实战应用:金融知识图谱构建与实战【企业内训现场实录】
- 如何压缩jpg图片的大小,操作简单的两个方法都教给你。