装饰器@property的使用总结

装饰器的使用总结:

0、装饰器的两个方法:访问器(getter)和修改器(setter)
1、不使用装饰器,也不设定私人属性,类中的属性值可以直接修改
2、不使用装饰器,使用单下划线声明为私人属性,类中的属性值不可以直接修改,但加上单下划线后可以修改。
(使用单下划线就相当于在原来的名字前面加个下划线,换了一个名字而已)
3、不使用装饰器,使用双下划线设定为私人属性,类中的属性值怎么都无法修改
4、使用装饰器@property,使用单下划线,不使用setter(修改器),类中的属性将可以被访问,但不可以被修改
5、定义了@property其实就可以被访问了,也就是使用了setter了。

例子对比论证:

1、没有装饰器,没有设定属性为私人

结果:属性将可以直接修改

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def play(self):
        if self._age <= 16:
            print("%s正在玩飞行棋"% self._name)
        else:
            print("%s什么都没玩"% self._name)
def main():
    person = Person('王大锤',12)
    person.play()   #输出:王大锤正在玩飞行棋
    #修改属性值
    person.age = 22
    person.name = '李元芳'
    person.play()   #输出:李元芳什么都没玩
if __name__ =='__main__':
    main()

2、没有装饰器,单下划线:声明是私人属性,不要轻易访问

(即外人可以访问,但大家都是成年人了,我说这是私人的,你就不要去访问了)
A、main函数中: 未使用单下划线修改
–>结果:不会被修改,但也不会报错
B、main函数中:使用单下划线修改
–>结果:成功修改被声明为私人属性的值

class Person(object):
    def __init__(self,name,age):
        #单下划线,声明属性为私人
        self._name = name
        self._age = age
    def play(self):
        if self.__age <= 16:
            print("%s正在玩飞行棋."% self._name)
        else:
            print("%s什么都没玩"% self._name)
def main():
    person = Person('王大锤',12)
    person.play()    #输出:王大锤正在玩飞行棋.
    
    #A、不使用单下划线访问修改
    person.age = 22
    person.name = '李元芳'
    person.play()    #输出:王大锤正在玩飞行棋.
    #可见,程序不会报错,也不会修改属性值
    
    #B、使用单下划线访问修改
    person._age = 22
    person._name = '李元芳'
    person.play()    #输出:李元芳什么都没玩.
    #可见,使用单下划线,是可以成功访问修改被声明为私人属性的值的
if __name__ =='__main__':
    main()

3、使用装饰器,使用单下划线

装饰器的两个方法:getter(访问器)和setter(修改器)

a、使用装饰器,使用单下划线,不使用setter(修改器),类中的属性将可以被访问,但不可以被修改b
b、使用setter(修改器),类中的属性可以被间接的修改

class Person(object):
    def __init__(self,name,age):
        self._name = name
        self._age = age
    #使用装饰器
    @property
    def name(self):
        return self._name
    @property
    def age(self):
        return self._age
        
    #对name使用setter,就可以修改name的值
    @age.setter
    def name(self,name):
        self._name = name
        
    #没有对age使用seter,将不可以修改age值
    def play(self):
        if self._age <= 16:
            print("%s正在玩飞行棋."% self._name)
        else:
            print("%s正在玩斗地主"% self._name)
            
def main():
    person = Person('王大锤',12)
    person.play()        #输出:王大锤正在玩飞行棋.
    
    #person.age = 22       #报错,因为没有使用setter修饰,所以不可以被修改
    
    person.name = '李元芳'    #name使用了steter修饰,所以可以被修改
    person.play()        #输出:李元芳什么都没玩.
if __name__ =='__main__':
    main()

总结:

0、装饰器的两个方法:访问器(getter)和修改器(setter),被 @property 装饰的方法是获取(getter)属性值的方法,被装饰方法的名字会被用做 属性名;
1、不使用装饰器,也不设定私人属性,类中的属性值可以直接修改
2、不使用装饰器,使用单下划线声明为私人属性,类中的属性值不可以直接修改,但加上但下划线后可以修改。(使用单下划线就相当于在原来的名字前面加个下划线,换了一个名字而已)
3、不使用装饰器,使用双下划线设定为私人属性,类中的属性值怎么都无法修改
4、使用装饰器,使用单下划线,使用getter(访问器),不使用setter(修改器),类中的属性将可以被访问,但不可以被修改

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值