Python入门:装饰器之@property

装饰器@property可将方法作为属性使用,配合@***.setter可完成私有属性的设置与获取。

属性私有化通常使用setter、getter方法来设置条件避免异常,关于私有化不再赘述。

不使用装饰器时的setter、getter方法

<code>

class

Person

:

def

__init__

(

self

, age):

self

.__age = age

def

setter_age

(

self

, age):

if

age

0

: print(

'年龄不能为负!'

)

else:

self

.__age = age

def

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 = age

def

setter_age

(

self

, age):

if

age

0

: print(

'年龄不能为负!'

)

else:

self

.__age = age @property

def

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 @property

def

age

(

self

):

return

self

.__age @age.setter

def

age

(

self

, age):

if

age

0

: 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 @property

def

age

(

self

):

return

self

.__age @age.setter

def

age

(

self

, age):

if

age

0

: print(

'年龄不能为负!'

)

else:

self

.__age = age @age.deleter

def

age

(

self

): del

self

.__age print(

'成功删除属性!'

) jack = Person(

18

) jack.age = -

9

jack.age =

19

print(

'jack的年龄是:'

, jack.age) del jack.age /<code>

以上就是关于装饰器@property的用法,如有错误之处请提醒更正。


分享到:


相關文章: