python@property,python中的property函数

  python@property,python中的property函数

  Python内置了三个修饰:@staticmethod(静态方法)、@classmethod(类方法)和@property(描述符),其中静态方法是在类中定义的函数,不需要定义;类在调用类属性和传递类对象时使用。而@property是一个非常好用的语法糖。@property最大的好处就是把一个方法变成了类中的一个属性调用,这个类打既能检查属性,还能用属性的方式来访问该属性的作用

  @property应用我们先来看看@property的应用。其功能1可定义只读属性,即真正的私有属性(属性前带双下划线的私有属性也可以访问。详情请参考本文:私有财产真的是私有的吗?)。要求是定义类人,有年龄和姓名。要求是年龄必须等于18岁,代码如下:

  类Person(object):def _ _ init _ _(self,name,Age=18): self。name=nameself。_ _ age=18 @ propertydef age (self):回归自我。_ _ agexm=person(晓明)#定义一个人的名字晓明打印(xm.age)#结果是18xm.age=-4#年龄不能分配打印(

  1traceback(最近一次调用last): xm.age=18attribute错误:无法设置属性在python中定义了只读属性,属于@property。如果你密切关注大部分源代码,就离不开@property。定义一个只读属性也非常简单:把要定义的属性作为方法名(在前面的例子中,age属性被定义为方法),用内置的decorator @property修饰它。

  @property真正厉害的是可以限制属性的定义。我们经常定义类,希望它们的属性一定是现实的,但是很难实现,因为__init__中定义的属性可以随意修改。如果我要实现Person类,规定每个人(也就是创建的实例)都必须大于18岁。如果正常实现,属性age必须设置为只读属性,然后由方法赋值。代码如下:

  类Person(object):def _ _ init _ _(self,name,age): self.name=name self。__age=18 @property def age(self):返回自我。__age def set_age(self,Age): #定义一个函数给self赋值。__age if age 18: print(年龄必须大于18) Return self。_ _年龄=年龄回归自我。_ _ age XM=person(晓明,20)print(XM . age)print(-)XM . set _ age(10)print(XM . age)print(-)XM . set _ age(20)print(

  18 -年龄必须大于18岁18 - 20可见可以通过方法限制输入,但是不是每个人都记得方法名,简化方法是什么?@物业很容易做到。按如下方式修改代码:

  类Person(object):def _ _ init _ _(self,name,age): self.name=name self。__age=18 @property def age(self):返回自我。__age @age.setter def age(self,age):如果年龄18: print(年龄必须大于18岁)返回self。__ _年龄=年龄回归自我。_ _ age XM=person(小明),20)print(XM . age)print(-)XM . age=10 print(XM . age)print(-)XM . age=20 print(XM . age)结果与上图一致。两处代码改动:将set_age改为age,并在顶部添加decorator @age.setter。这是@property定义可访问属性的语法,也就是仍然是以属性名为方法名,并在方法名上增加@属性.setter就行了

  @property实现原理开头说@property是一个描述符(decorator),其实它本身就是一个类。如果你不相信我,你可以修改上面的代码如下:

  类人(对象):def __init__(本人,姓名,年龄):本人。name=nameself。_ _ age=18 def get _ age(self):# Recovery使用方法名来获取和定义返回的self。_ _ age def set _ age (self,age):如果年龄18: print(年龄必须大于18岁)返回self。___年龄=年龄回归自我。___ age=property (get _ age,set _ age) #添加property类上面代码的运行结果和前面一样,把@property修饰的属性方法重新修改回定义方法名,然后在类的底部定义:attribute=property(get,set,del)。这种格式是固定的,你可以通过源代码知道原因。属性的部分源代码如下:

  class Property(object):def _ _ init _ _(self,fget=None,fset=None,fdel=None,doc=None) :""" Property属性。fget函数用于获取属性值fset函数用于设置属性值fdel函数用于定义属性class C(object):@ property def x(self):我是 x 属性回归自我。_x @x.setter def x(self,value): self。_ x=value @ x . deleter def x(self):del self。_x """ pass def __set__(self,*args,* * kwargs):# real signature unknown 将实例的属性设置为值。 pass def __get__(self,*args,* * kwargs):# real signature unknown 返回实例的属性,该属性的类型为owner。 pass def __delete__(self,*args,* * kwargs):# real signature unknown 删除实例的属性。pass为了不太长同时影响阅读效果,这里截取了一部分。可以看到官方的@property用法是写在代码注释里的,如果同时用class实现的话,get、set、del方法必须按照fget/fset/fdel的顺序填写在__init__的参数里,因为都是默认参数,所以不用写就可以省略。

  介绍python描述符,定义:如果在一个类中定义了__set__ 、__get __、__delete __三个方法中的一个,并将另一个类的属性赋为实例,那么这个类就可以称为描述符。因为目前使用描述符的是python,所以了解一下就够了。

  总结一下@property的介绍,@property decorator是一个语法糖(语法糖指的是那些没有给计算机语言增加新功能,只是对人类“更甜”的语法。语法往往为程序员提供了更实用的编码方法,有利于更好的编码风格,更容易阅读。)。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: