面向对象中的property装饰器讲解
面向对象中可以用property来修饰我们的函数,必须下面的例子
class Test(object):
def __init__(self,name):
self.name = name @property
def run(self):
print(self.name) def talk(self):
print(self.name)
使用property修饰有什么效果的,他会把一个类的方法变成了一个类的属性,这样,我们调用的run这个方法的时候,就像直接调用属性一样调用,不需要再像调用方法一样加一个括号,相反,如果你加了括号去调用,反而会报错
下面的例子,我们实例出来一个对象,分别调用run和talk
if __name__ == '__main__':
t = Test("中国是个大傻逼")
t.talk()
t.run
结果如下
中国是个大傻逼
中国是个大傻逼
至此,我们知道如果一个类的方法被@property修饰后,我们该如何调用了,那么大家难免还有一个疑问,这有什么卵用,不就是多一个括号少一个括号的问题,有必要搞那么复杂吗?仔细想一想,似乎真没有多大必要,你用@property修饰和不用@propery修饰,真没什么区别,但是大家看下下面的场景
我写了一个这样的类
class Test_property(object):
def __init__(self):
pass def get_age(self):
return self._age def set_age(self,age):
if age >= 100:
raise ValueError("年龄不能大于100")
elif age < 1:
raise ValueError("年龄不能小于1")
else:
self._age = age
比如我们定义一个属性,没有办法去控制这个属性的值,比如我们上面的例子,如果我们在构造方法init中直接设置年龄的话,那么如果用户设置了一个1000岁,这个明显就不符合常理,所以要把设置年龄这个属性修改为方法,这样我们就可以在方法中做各种的控制,但是这个方法又不大不小,按照我们的使用习惯,肯定还是设置属性的方式去设置年龄更加的符合操作系统,这个时候,我们就可以用到property这个装饰器了
我们首先使用@property这个装饰器,装饰get_age这个方法,这里记住,使用@propery这个装饰器装饰的方法只能有一个参数,那就是self,当前我们用@propery这个装饰器装饰了get_age这个方法后,python就会自动为我们生产一个@get_age.setter的装饰器,这个装饰器,同样也是把一个方法变成了一个属性,但是他可以传递参数,必须下面的例子
class Test_property(object):
def __init__(self):
pass @property
def get_age(self):
return self._age @get_age.setter
def set_age(self,age):
if age >= 100:
raise ValueError("年龄不能大于100")
elif age < 1:
raise ValueError("年龄不能小于1")
else:
self._age = age if __name__ == '__main__': t = Test_property() t.set_age=101 print(t.get_age)
这样,我们即可用通过调用属性的方式去调用方法,也可以实现各种逻辑判断
总结一下,在面向对象中,如果要设置一个属性,但是这个属性需要一些判断或者逻辑处理,那么就需要用到@propery 这个装饰器,通过这个装饰器设置这个属性的值,然后在获取这个值
至此,@property这个装饰器我们就讲完了。不知道大家是否掌握了。
面向对象中的property装饰器讲解的更多相关文章
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)
封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...
- Python中的@property装饰器
要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,n ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- [转载]Python使用@property装饰器--getter和setter方法变成属性
原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- 面向对象之封装 及@property装饰器使用
目录 封装 1.封装的定义 2.封装的目的: 3.封装的三种方式 4.封装的优点 5.访问限制(封装) @property 装饰器 属性property底层实现 封装 1.封装的定义 将复杂的丑陋的, ...
- 面向对象之组合、封装、多态、property装饰器
概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...
- 面向对象之 组合 封装 多态 property 装饰器
1.组合 什么是组合? 一个对象的属性是来自另一个类的对象,称之为组合 为什么要用组合 组合也是用来解决类与类代码冗余的问题 3.如何用组合 # obj1.xxx=obj2''''''# class ...
随机推荐
- Linux用户名、用户组的相关命令
whoami 查看当前登录用户 id 用户名 查看用户名的id 及所属组 groups 查看当前登录用户的所有所属组 groups 用户名 查看指定用户的所有所属组 cat /etc/passwd ...
- Nginx反向代理时tomcat日志获取真实IP
对于nginx+tomcat这种架构,如果后端tomcat配置保持默认,那么tomcat的访问日志里,记录的就是前端nginx的IP地址,而不是真实的访问IP.因此,需要对nginx.tomcat做如 ...
- c/c++基础 const
int main(int argc, char* argv[]) { '; '; a1='; //a2='2'; //a2是字符常量 "; "; a3="; //a4=& ...
- node 开始深入
一起学nodejs 讲师: matthew vscode+nodejs4.6 http://list.youku.com/albumlist/show/id_27966955.html?spm=a2h ...
- DNS协议工作过程;DNS的安全隐患
DNS协议工作过程 下面以域名为m.xyz.com的主机欲通过另一个主机的域名y.abc.com的IP地址为例,简述DNS协议过程. 主机m.xyz.com先向其本地服务器dns.xyz.com进 ...
- 13.BeanUtils组件-基础.md
目录 用途 基本属性的设置 Map数据的拷贝 对象的拷贝 转换器 用途 可以用来对JavaBean的各种增强操作 基本属性的设置 package per.liyue.code.beanutildemo ...
- C++ 将数据转为字符串的几种方法
收集一下: 1\将int 转为 LPCTSTR 其实LPCTSTR可以直接使用CString直接代替,无需类型强制转换 CString str; ; //str="15" str. ...
- python列表中,多次追加元素
在列表中追加元素,可以使用append(),列表相加也可以用extend()函数,多次追加元素可以用“+”实现 l=[1,2,3,4,5] x=6 y=7 z=8 l=l+[x]+[y]+[z] pr ...
- ADO.Net 数据库修改
数据库的修改方法和增加一样,只是把增加语句换成了修改语句,后面执行语句是相同的 首先也是需要获取并接收输入的要修改的哪个数据以及修改后的数据 代码演示: using System; using Sys ...
- lua keynote
[lua keynote] 1.两个减号是单行注释: -- --[[ 多行注释 多行注释 --]] ---[[ // 三个'-'开启的是一个行注释--]] 1.1.两条语句可以在同一行,并表不需要分号 ...