【Python编程技巧】简单理解和使用Python中@property

简介: 如果你还学习过其他诸如java,php等面向对象编程语言的话,你会发现,其实Python面向对象跟其他的编程语言的面向对象基本是一样的,只是语言语法上的有些许的差别而已.Python中的类同样包括类的属性和类的方法.同时一样也拥有面向对象的三大特征.接下来,我们先来看看本文的主角:Python中有关于属性的概念

引言


如果你还学习过其他诸如java,php等面向对象编程语言的话,你会发现,其实Python面向对象跟其他的编程语言的面向对象基本是一样的,只是语言语法上的有些许的差别而已.Python中的类同样包括类的属性和类的方法.同时一样也拥有面向对象的三大特征.接下来,我们先来看看本文的主角:Python中有关于属性的概念


属性


实例属性:通过实例变量或self来定义.

类属性:定义在类中的属性.

私有属性:Python面向对象的属性,可以更加方便地访问私有数据成员.

在Python中,可以通过@property将一个实例方法转换为同名属性,从而实现用于计算的属性.将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号"()",这样可以让代码更整洁.


语法如下:

@property

def methodnames(self):

statement block


参数说明如下:

  • methodnames:用于指定方法名.一般使用小写字母开头
  • self:表示类的实例
  • statement block:方法体,用于实现具体的功能,在方法体中,通常以return语句结束,用于返回计算结果.return后面的语句一定不会执行


说明:通过@property转换后的属性不能重新赋值.如果对其重新赋值,将会抛出异常信息.通过getter和setter方法定义只读和修改属性,shiy@methodnames.getting可以修饰新的实例方法,从而修改实例的属性.


实例讲解


可能光说概念比较抽象.不好理解.下面我们通过实例展开来学习,这样显得更加通俗易懂一点

简单地说,一个类里面的方法一旦被@property装饰,就可以像调用属性一样地去调用这个方法,它能够简化调用者获取数据的流程,而且不用担心将属性暴露出来,有人对其进行赋值操作(避免使用者的不合理操作)。需要注意的两点是:

  1. 调用被装饰方法的时候是不用加括号的
  2. 方法定义的时候有且只能有self一个参数


具体用法如下:


@propertydefpassword(self):
raiseAttributeError('password is not a readable attribute')
@password.setterdefpassword(self, password):
self.password_hash=generate_password_hash(password)

比如:在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,也就是java中的bean;那在python中,我们该怎么做能够少写代码,既能优雅地实现想要的限制的同时,还能减少错误的发生呢


写法对比


没使用@property是这样写的:


classEmployee(object):
defget_salary(self):
returnself._salarydefset_salary(self, value):
self._salary=values=Employee()
s.set_salary(8000)
print(s.get_salary())
print("修改员工工资为:")
s.set_salary(9999)
print(s.get_salary())


使用@property是这样写的:

方法一
classEmployee(object):
@propertydefsalary(self):
returnself._salary@salary.setterdefsalary(self, value):
ifvalue<0:
raise'error:工资必须大于零'self._salary=values=Employee()
s.salary=8000print(s.salary)
print("修改员工工资为:")
s.salary=18888print(s.salary)


执行结果:

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


把get方法变为属性只需要加上@property装饰器即可,此时@property本身又会创建另外一个装饰器@salary.setter,负责把set方法变成给属性赋值,这样调用起来非常方便,代码的可读性也有所提高.然后通过调用属性的方式直接调用到 salary方法,因为@property已经把复杂的处理过程封装到了方法里面去,这样在取值的时候调用相应的方法名即可


方法二


除了上面的写法,还可以使用property() 函数来实现同样的功能,但是没有上面写法那么简单,因为还要书写getter和setter方法.然后再通过property() 函数返回

property() 函数的作用是在新式类中返回属性值。


语法:

classproperty([fget[, fset[, fdel[, doc]]]])


参数:一共有四个参数

  • fget -- 获取属性值的函数,调用 对象.属性时自动触发
  • fset -- 设置属性值的函数,给属性赋值时自动触发
  • fdel -- 删除属性值函数,删除属性时自动触发
  • doc -- 字符串类型,是属性的描述信息,调用对象.属性.doc时触发


返回值:

返回新式类属性


废话不多说,直接上代码:

classEmployee():
def__init__(self, salary=5000):
self._salary=salarydefget_salary(self):
returnself._salarydefset_salary(self, salary):
self._salary=salarydefdel_salary(self):
delself._salarya_sl=property(get_salary, set_salary)
s=Employee()
s.a_sl=8000print(s.a_sl)
print("修改员工工资为:")
s.a_sl=9999print(s.a_sl)
目录
相关文章
|
6月前
|
Python
97 python高级 - 属性property
97 python高级 - 属性property
28 0
|
9月前
|
数据库 Python
【从零学习python 】61.Python中的property属性详解和应用示例
【从零学习python 】61.Python中的property属性详解和应用示例
56 0
|
Java 程序员 Python
一文轻松搞定Python装饰器@property
一文轻松搞定Python装饰器@property
90 0
|
数据安全/隐私保护 Python
Python property使用简介
Python property使用简介
91 0
Python装饰器3-funtools.wraps与property装饰器
funtools.wraps装饰器、property装饰器、多装饰器的执行顺序
Python装饰器3-funtools.wraps与property装饰器
|
程序员 数据库 开发者
Python中property的使用技巧
既要保护类的封装特性,又要让开发者可以使用 **对象.属性** 的方式操作方法,`@property 装饰器`,可以直接通过方法名来访问方法,不需要在方法名后添加一对 `()` 小括号。
|
Python
【Python面向对象进阶】——@property装饰器的用法
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把属性值随便改.
111 0
【Python面向对象进阶】——@property装饰器的用法
|
Python
Python的@property是干嘛的?| Python 主题月
Python的@property是干嘛的?| Python 主题月
|
Python
Python高级语法4:类对象和实例对象访问属性的区别和property属性
Python高级语法4:类对象和实例对象访问属性的区别和property属性
129 0
|
Python
Python - 面向对象编程 - @property (下)
Python - 面向对象编程 - @property (下)
110 0