在对@property的学习时只知道它能把方法变成属性简化私有属性的调用
今天在学习时遇上,发现找不出它的定位,于是开始深度学习,以下是学习过程
目录
结论放最前面:
这个装饰器本质就是把类变成属性来调用,把方法变成属性后可以通过
- 写方法前面加@property,用过调用这个方法名(已经转变成属性)来访问私有属性
- 写同名方法,前面加@ara.setter(只有用了@property才能用)来定制实例属性的修改方式
- 通过写同名方法,前面加@ara.deleter(只有用了@property才能用)来定制实例属性的删除方式
好处:
把存放私有的实例属性的方法名字设定的和该属性名字不同,从而起到保护该私有属性的作用
定制私有属性,使其使用变的可控
实例:实例私有属性的@property方法
class Rect:
a = 100
def __init__(self, area, are):
self.__area = area
self.are = are
# 开始定制
@property
def test(self):
return self.__area
#定制修改(必须先调用@property后才能使用,方法名必须一样)
@test.setter
def test(self, value):
self.__area = value + 1
@test.deleter
def test(self):
self.__area = None
#实例化
rect = Rect(30, 10)
# 直接通过方法名来访问 __area 值,和修改
print(rect.are) #30
#自动调用修改方法
rect.test = 40
#非私有属性
rect.are = 40
print(rect.are) #40
print(rect.test) #41
del rect.test
print(rect.test) #None
私有类属性也可以调用:
class Rect:
__a = 100
def __init__(self, area, are):
self.__area = area
self.are = are
# 开始定制
@property
def test(self):
return self.__a
#定制修改(必须先调用@property后才能使用,方法名必须一样)
@test.setter
def test(self, value):
self.__a = value + 1
@test.deleter
def test(self):
self.__a = None
rect = Rect(30, 10)
# 直接通过方法名来访问 __area 值,和修改
print(rect.test) # 100
rect.test = 30
print(rect.test) # 31
del rect.test
print(rect.test) # None