装饰器@property可将方法作为属性使用,配合@***.setter可完成私有属性的设置与获取。
属性私有化通常使用setter、getter方法来设置条件避免异常,关于私有化不再赘述。
不使用装饰器时的setter、getter方法
<code>class
Person
:def
__init__
(
self
, age):self
.__age = agedef
setter_age
(
self
, age):if
age0
: print('年龄不能为负!'
)else:
self
.__age = agedef
getter_age
(
self
):return
self
.__age jack = Person(18
) jack.setter_age(-9
) jack.setter_age(19
) print('jack的年龄是:'
, jack.getter_age()) /<code>
使用装饰器@property
<code>class
Person
:def
__init__
(
self
, age):self
.__age = agedef
setter_age
(
self
, age):if
age0
: print('年龄不能为负!'
)else:
self
.__age = age @propertydef
age
(
self
):return
self
.__age jack = Person(18
) jack.setter_age(-9
) jack.setter_age(19
) print('jack的年龄是:'
, jack.age) /<code>
注意:最后jack.age没有使用调用方法对象.方法()的方式,而是用调用对象属性对象.属性的方式。
使用装饰器@property和@***.setter
<code>class
Person
:def
__init__
(
self
, age):self
.__age = age @propertydef
age
(
self
):return
self
.__age @age.setterdef
age
(
self
, age):if
age0
: print('年龄不能为负!'
)else:
self
.__age = age jack = Person(18
) jack.age = -9
jack.age =19
print('jack的年龄是:'
, jack.age) /<code>
与前面对比,直接用赋值运算符=来对属性进行赋值,使用已经与未私有化时相同。
注意:这里的age虽然是属性,但是不能执行del(jack.age)操作,AttributeError: can't delete attribute,也无法删除私有属性__age,AttributeError: __age
使用@***.deleter
<code>class
Person
:def
__init__
(
self
, age):self
.__age = age @propertydef
age
(
self
):return
self
.__age @age.setterdef
age
(
self
, age):if
age0
: print('年龄不能为负!'
)else:
self
.__age = age @age.deleterdef
age
(
self
): delself
.__age print('成功删除属性!'
) jack = Person(18
) jack.age = -9
jack.age =19
print('jack的年龄是:'
, jack.age) del jack.age /<code>
以上就是关于装饰器@property的用法,如有错误之处请提醒更正。