装饰器的使用总结:
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(修改器),类中的属性将可以被访问,但不可以被修改