.price)
# 直接就可以调用函数price,但是也可以说是私有属性price,加上@property后可以等同,但是本质还是name函数
运行结果:
6、利用@property和xxx.deleter删除私有属性
没有执行del self.__name
class Person:
def __init__(self,name):
self.__name = name
@property # 将函数伪装成属性,实例化后可以直接调用私有属性,本质上还是函数
def name(self):
return self.__name
@name.deleter # 启动删除机制,没有实际执行删除操作,而是通过@name里面的函数方法执行相应的删除操作
def name(self):
print('执行了这个方法')
# del self.__name # 实际的删除操作
brother2 = Person('二哥')
print(brother2.name)
del brother2.name # 一出现del就要回到@xxx.deleter的地方并且在其下面函数方法中执行对应的删除操作
print(brother2.name)
运行结果:
执行del self.__name
class Person:
def __init__(self,name):
self.__name = name
@property # 将函数伪装成属性,实例化后可以直接调用私有属性,本质上还是函数
def name(self):
return self.__name
@name.deleter # 启动删除机制,没有实际执行删除操作,而是通过@name里面的函数方法执行相应的删除操作
def name(self): # 不能传参数 print('执行了这个方法')
del self.__name # 实际的删除操作
brother2 = Person('二哥')
print(brother2.name)
del brother2.name # 一出现del触发删除机制,就要回到@xxx.deleter的地方并且在其下面函数方法中执行对应的删除操作
print(brother2.name)
print(brother2.name)
运行结果:
二哥
Traceback (most recent call last):
执行了这个方法
File "<encoding error>", line 89, in <module>
File "<encoding error>", line 81, in name
AttributeError: 'Person' object has no attribute '_Person__name'
从上面这两个程序以及运行结果可以验证:
(1)当 del brother2.name 的时候就会马上触发删除机制 @name.deleter,而触发删除机制后,只有做出对应的删除操作 del self.__name ,最后才会删除成功
(2)在存在@property的前提下,(1)中的三个name和@name deleter下面的函数名name所在的地方的名字以及@property下面的函数方法名字必须是相同的,否则就不能做到删除私有属性的操作