# -*- coding:utf-8 -*-
1.对@property-1好@property-2的总结
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 私有属性
self.__number = 0
2.这两个函数的作用,就是为了在类声明的外部,可以访问到私有属性值
专门定义函数获取私有属性值
def num(self):
# 返回私有属性值
return self.__number
专门定义函数设置私有属性值
# set 是一个函数名,随便取
def set(self, value):
# 给对象的属性赋值
self.__number = value
3. 专门定义函数删除私有属性
def delete_attr(self):
# 删除属性
del self.__number
4. 获取私有属性值 number=p1.number,会返回一个结果
@property
def number(self):
# 返回私有属性值
return self.__number
5. 设置私有属性值 p1.number=666
@number.setter
def number(self, value):
# 设置__number的值
self.__number = value
6.删除私有属性 del p1.number 会执行这个函数
@number.deleter
def number(self):
# 删除属性
del self.__number
7.普通设置和获取age的函数
def set_age(self, value):
# self 是p1 p1.age=30
self.age = value
def get_age(self):
return self.age
8.加了装饰器的work函数的获取,设置,删除
@property
def work(self):
print('执行了@property装饰的work函数')
return 10*10
@work.setter #当 对象.work=值 会执行这个函数
def work(self, value):
print('执行了@work.setter装饰的work函数')
print(value)
@work.deleter #当 del 对象.work 会执行这个函数
def work(self):
print('执行了@work.deleter装饰的work函数')
9.调用执行
p1 = People('张三', 22)
print(p1.name)
p1.name = '李四'
print(p1.name)
setattr(p1, 'name', '王五')
print(p1.name)
10. 对象.函数(参数)
p1.set_age(30)
print(p1.set_age)
print(p1.age)
11. 有@property 的不需要加括号 rs = p1.work,没有的是 rs = p1.work()
p1.work
rs = p1.work
print(rs)
# 执行@work.setter装饰的函数
p1.work = 2000
执行@work.deleter装饰的函数
del p1.work
12 在类声明的外部,无法直接访问私有属性
# p1.__number
number = p1.num()
print(number)
# 在类声明的外部,无法直接访问私有属性值
# p1.__number=1000
p1.set(1000)
number = p1.num()
print(number)
# 在类声明的外部,无法直接访问私有属性值
# del p1.__number
# p1.delete_attr()
13.正常的对象属性赋值
# 对象.属性名=属性值
p1.name = '李四'
# 获取对象的属性值
name = p1.name
# 删除对象的属性值
del p1.name
14. 私有属性升级版
# 会去执行@property装饰的number函数,函数执行完成后返回一个结果
num1 = p1.number
print(num1)
# 会去执行@number.setter装饰的number函数,在函数中设置__number属性的值
p1.number = 666
# 会去执行@number.setter装饰的number函数,函数执行完之后返回一个结果
print(p1.number)
# 会去执行@number.deleter装饰的number函数,在函数中会将__number属性删除
del p1.number
# print(p1.number)
15.完整代码
# -*- coding:utf-8 -*-
# 下午
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 私有属性
self.__number = 0
# 这两个函数的作用,就是为了在类声明的外部,可以访问到私有属性值
# 专门定义函数获取私有属性值
def num(self):
# 返回私有属性值
return self.__number
# 专门定义函数设置私有属性值
# set 是一个函数名,随便取
def set(self, value):
# 给对象的属性赋值
self.__number = value
# 专门定义函数删除私有属性
def delete_attr(self):
# 删除属性
del self.__number
# 获取私有属性值 number=p1.number,会返回一个结果
@property
def number(self):
# 返回私有属性值
return self.__number
# 设置私有属性值 p1.number=666
@number.setter
def number(self, value):
# 设置__number的值
self.__number = value
# 删除私有属性 del p1.number 会执行这个函数
@number.deleter
def number(self):
# 删除属性
del self.__number
def set_age(self, value):
# self 是p1 p1.age=30
self.age = value
def get_age(self):
return self.age
@property
def work(self):
print('执行了@property装饰的work函数')
return 10*10
@work.setter #当 对象.work=值 会执行这个函数
def work(self, value):
print('执行了@work.setter装饰的work函数')
print(value)
@work.deleter #当 del 对象.work 会执行这个函数
def work(self):
print('执行了@work.deleter装饰的work函数')
p1 = People('张三', 22)
print(p1.name)
p1.name = '李四'
print(p1.name)
setattr(p1, 'name', '王五')
print(p1.name)
# 对象.函数(参数)
p1.set_age(30)
print(p1.set_age)
print(p1.age)
# 有@property 的不需要加括号rs = p1.work,没有的是rs = p1.work()
p1.work
rs = p1.work
print(rs)
# 执行@work.setter装饰的函数
p1.work = 2000
# 执行@work.deleter装饰的函数
del p1.work
# 在类声明的外部,无法直接访问私有属性
# p1.__number
number = p1.num()
print(number)
# 在类声明的外部,无法直接访问私有属性值
# p1.__number=1000
p1.set(1000)
number = p1.num()
print(number)
# 在类声明的外部,无法直接访问私有属性值
# del p1.__number
# p1.delete_attr()
# 正常的对象属性赋值
# 对象.属性名=属性值
p1.name = '李四'
# 获取对象的属性值
name = p1.name
# 删除对象的属性值
del p1.name
# 私有属性升级版
# 会去执行@property装饰的number函数,函数执行完成后返回一个结果
num1 = p1.number
print(num1)
# 会去执行@number.setter装饰的number函数,在函数中设置__number属性的值
p1.number = 666
# 会去执行@number.setter装饰的number函数,函数执行完之后返回一个结果
print(p1.number)
# 会去执行@number.deleter装饰的number函数,在函数中会将__number属性删除
del p1.number
# print(p1.number)
16.执行结果为:
张三
李四
王五
<bound method People.set_age of <__main__.People object at 0x0000000000AC4748>>
30
执行了@property装饰的work函数
执行了@property装饰的work函数
100
执行了@work.setter装饰的work函数
2000
执行了@work.deleter装饰的work函数
0
1000
1000
666