设为首页 加入收藏

TOP

封装和@property(二)
2019-06-24 22:05:56 】 浏览:112
Tags:封装 @property
.price)

# 直接就可以调用函数price,但是也可以说是私有属性price,加上@property后可以等同,但是本质还是name函数
 
 

运行结果:

 
 
4.0
 
 

 

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下面的函数方法名字必须是相同的,否则就不能做到删除私有属性的操作

 







首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Django模板系统:Template 下一篇『Python基础』第二节: Python简..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目