文章目录

  • 前言
  • 普通示例
  • 对属性赋值进行约束
  • @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

注意事项:

  1. 属性名与方法名一定要区分开,不然会进入死循环self._agedef age()
  2. 实例化的对象使用属性时,不是调用属性(meizi._age),而是用的方法名(meizi.age
  3. @property其实就是实现了getter功能; @xxx.setter实现的是setter功能;还有一个 @xxx.deleter实现删除功能
  4. 定义方法的时候 @property必须在 @xxx.setter之前,且二者修饰的方法名相同(age()
  5. 如果只实现了 @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的使用相关推荐

  1. redisson get()数据报错,missing type id property ‘@class’

    redisson get()数据报错: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when ...

  2. Java | kotlin 手动注入bean,解决lateinit property loginService has not been initialized异常

    kotlin.UninitializedPropertyAccessException: lateinit property loginService has not been initialized ...

  3. kotlin Bean加载失败lateinit property has not been initialized

    Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...

  4. python 创建只读的函数(@property的介绍与使用)

    @property 介绍 @property 是python 中的修饰符,将方法转为属性,可以直接通过方法名来访问,注意访问的时候后面不需要添加小括号,否则会报错,作用是将函数变为只读的,不能修改,否 ...

  5. Android 属性动画(Property Animation) ObjectAnimator的介绍

    先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...

  6. Android 属性动画(Property Animation) ValueAnimator 的介绍

    先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...

  7. java property异常_Java常见的异常和解决的办法

    Java程序设计中我们经常会遇到异常,遇到异常不要浮躁,找到问题的原因解决是很容易的.我们整理了一些异常和解决的方法供大家参考. 1.java.lang.IllegalStateException: ...

  8. 1-runtime的Method,IMP,Property,ivar

    基础定义 objc-750 的tar包 objc-private.h 定义 typedef struct objc_class *Class; typedef struct objc_object * ...

  9. python中的类的成员变量以及property函数

    1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用"类."来引用 ...

  10. 定义一个属性_Python property属性

    1. 什么是property属性 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法 # ############### 定义 ###############class Foo: def ...

最新文章

  1. Python3.5源码分析-List概述
  2. linux postgres用户,关于linux:在启动时创建postgres用户
  3. c语言数据类型_C语言基础数据类型
  4. 后盾网php多少钱_商标转让做公证花多少钱-购店网
  5. vue 切换页面没有改变滚动条_Web前端高级Vue学习笔记(三)
  6. 【bzoj 3595】: [Scoi2014]方伯伯的Oj
  7. Jquery遮罩插件,想罩哪就罩哪!
  8. Git常用的步骤和命令
  9. Java反射机制总结(实例分析)(一)
  10. 并发(concurrent)、并行(parallel)、顺序(sequential)、串行(serial)是什么 区别
  11. 基于内容的视频搜索引擎
  12. SpringBoot+Vue+Cas单点登录与登出
  13. 网页设计Dreamweaver【2】
  14. vue实现刷新页面,页面回到顶部
  15. 标准成本还是实际成本 成本核算标准选择
  16. Kali Linux学习笔记—无线渗透 WPA攻击(PSK破解、AIROLIB、JTR、cowpatty、pyrit)
  17. 电脑重装系统数据恢复方法教程
  18. PHP自学笔记 | phpmyadmin无法访问——开放888端口
  19. 计算机自我鉴定高中生200字,高中生毕业自我鉴定200字
  20. 模拟语音交换机和IP电话系统的互联互通

热门文章

  1. medsem-中介效应:基于结构方程模型SEM的中介效应分析
  2. JAVA 使用aspose.cad将dwg文件转PDF(每个布局转为一页)
  3. 服务器监控系统应有哪些功能,公安视频监控系统需要具备哪些功能
  4. 微信小程序与普通网页区别
  5. 快捷连接 残差_残差网络解决了什么问题
  6. 【ionic框架bug】slidebox在使用model或popover后width变为0的解决方案
  7. 静态类型语言、动态类型语言、强类型定义语言、弱类型定义语言、编译型语言、解释型语言...
  8. 苹果电池显示维修_iFixit拆解苹果iPhone 12/Pro:显示屏和电池可互换
  9. 人工智能商业实战应用:金融知识图谱构建与实战【企业内训现场实录】
  10. 如何压缩jpg图片的大小,操作简单的两个方法都教给你。