类的封装(property)
封装
封装程序的主要原因:保护隐私;而封装方法的主要原因是:隔离复杂的执行过程
- property的特性
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
import math
class circular:
def __init__(self,radius,):
self.radius=radius
@property #area=property(area)
def area(self):
#print("圆的面积是:%s"%(int(self.radius)**2*self.Pi))
res=int(self.radius)**2*math.pi
print(res)
return res
@property #circumference=property(circumference)
def circumference(self):
# print("圆的周长是:%s"%(self.Pi*2*int(self.radius)))
res1=math.pi*2*int(self.radius)
print(res1)
return res1
t=circular("3")
t.area
t.circumference
"D:\Program Files\python.exe" "E:/py_code/day 12/类的封装.py"
28.274333882308138
18.84955592153876
Process finished with exit code 0
这里需要知道的用户在执行obj.area或者obj.circumference不能被赋值的,因为实际上执行的过程我们是调用的是一个函数,这里只是被伪装成一个对象的属性。所以这里需要特别注意
- 隐藏--功能
其次也有另一种方式:
class people:
def __init__(self,name,age,sex,height,weight):
self.__name=name #self.__name=_people__name
self.__age=age
self.__sex=sex
self.__height=height
self.__weight=weight
def tell_name(self):
print(self._name)
def set_name(self,val):
if not isinstance(val,str):
raise TypeError("名字必须是字符串类型")
self.__name=val
def tell_info(self):
print('''
------------%s info----------
name:%s
age:%s
sex:%s
height:%s
weight:%s
----------- info------------
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight))
t1=people("whatmini",18,"man","64kg","1.75")
t1.tell_info()
print(t1._people__age)
"D:\Program Files\python.exe" "E:/py_code/day 12/类.py"
------------whatmini info----------
name:whatmini
age:18
sex:man
height:64kg
weight:1.75
----------- info------------
18
Process finished with exit code 0
上述中self.__name=name实际就是将name的结果封装起来,真实存放的位置在self._people中,但是我们如果想要去访问则需要obj._people__name才能找到真实信息。很明显我们需要给用户提供提供一个封装好的接口给到其访问所以如下:
class people:
def __init__(self,name,age,sex,height,weight):
self.__name=name #self.__name=_people__name
self.__age=age
self.__sex=sex
self.__height=height
self.__weight=weight
@property
def name(self):
return self.__name # 用户查询name时会直接将name返回
def set_name(self,val):
if not isinstance(val,str):
raise TypeError("名字必须是字符串类型")
self.__name=val
def tell_info(self):
print('''
------------%s info----------
name:%s
age:%s
sex:%s
height:%s
weight:%s
----------- info------------
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight))
t1=people("whatmini",18,"man","64kg","1.75")
print(t1.name)
"D:\Program Files\python.exe" "E:/py_code/day 12/类.py"
whatmini
Process finished with exit code 0
这里同样我们会遇到一个问题就是如何去修改对象的属性,用户在调用对象属性时有时会对属性进行修改和删除的操作,但是此时的属性是被封装后的一个函数,所以这里要用到下面的两个函数:
- obj.setter
class people:
def __init__(self,name,age,sex,height,weight):
self.__name=name #self.__name=_people__name
self.__age=age
self.__sex=sex
self.__height=height
self.__weight=weight
@property
def name(self):
return self.__name # 用户查询name时会直接将name返回
@name.setter
def name(self,val):
if not isinstance(val,str):
raise TypeError("%s must be str"%val) #设置报错机制当指定用户的输入类型
self.__name=val #当用户输入的类型合格后则将用户的修改的值进行重新赋值
def tell_info(self):
print('''
------------%s info----------
name:%s
age:%s
sex:%s
height:%s
weight:%s
----------- info------------
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight))
t1=people("whatmini",18,"man","64kg","1.75")
t1.name="shan"
print(t1.name)
"D:\Program Files\python.exe" "E:/py_code/day 12/类.py"
shan
Process finished with exit code 0
- obj.name
class people:
def __init__(self,name,age,sex,height,weight,tag=False):
self.__name=name #self.__name=_people__name
self.__age=age
self.__sex=sex
self.__height=height
self.__weight=weight
self.tag=tag #设定标志位,当tag=True
@property
def name(self):
return self.__name # 用户查询name时会直接将name返回
@name.setter
def name(self,val):
if not isinstance(val,str):
raise TypeError("%s must be str"%val) #设置报错机制当指定用户的输入类型
self.__name=val #当用户输入的类型合格后则将用户的修改的值进行重新赋值
@name.deleter
def name(self):
if not self.tag:
raise PermissionError("Cannot perform")
del self.__name
def tell_info(self):
print('''
------------%s info----------
name:%s
age:%s
sex:%s
height:%s
weight:%s
----------- info------------
''' %(self.__name,
self.__name,
self.__age,
self.__sex,
self.__height,
self.__weight))
t1=people("whatmini",18,"man","64kg","1.75",True)
t1.name="shan"
del t1.name
print(t1.name)
"D:\Program Files\python.exe" "E:/py_code/day 12/类.py"
Traceback (most recent call last):
File "E:/py_code/day 12/类.py", line 262, in <module>
print(t1.name)
File "E:/py_code/day 12/类.py", line 229, in name
return self.__name # 用户查询name时会直接将name返回
AttributeError: 'people' object has no attribute '_people__name'
Process finished with exit code 1
这里可以看到我们已经将name这个对象属性删掉了。所以查看时编译器会进行报错。
类的封装(property)的更多相关文章
- python 类的封装/property类型/和对象的绑定与非绑定方法
目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...
- Python类总结-封装(Property, setter, deleter)
Property #property #内置装饰器函数,只在面向对象中使用 from math import pi class Circle: def __init__(self,r ): self. ...
- 抽象类,接口类,封装,property,classmetod,statimethod
抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- Django分页类的封装
Django分页类的封装 Django ORM 封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...
- iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理
一.旋转动画的实现 二.音乐工具类的封装 -- 返回所有歌曲,返回当前播放歌曲,设置当前播放歌曲,返回下一首歌曲,返回上一首歌曲方法的实现 头文件 .m文件 #import "ChaosMu ...
- Java—类的封装、继承与多态
一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> ...
- 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...
- 025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装
上一篇文章提过,HSSF的用户模式会导致读取海量数据时很慢,所以我们采用的是事件驱动模式.这个模式类似于xml的sax解析.需要实现一个接口,HSSFListener接口. 原理:根据excel底层存 ...
随机推荐
- 201521123112《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代 ...
- 201521123011《Java程序设计》 第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123025《java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 1.1建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 1.2在自己建立的数据库上执行常见SQL语句 ...
- 201521123110《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 2. 使用JDBC连接数据库与Statement 2.1 使用Statement操作数据库.(粘贴一段你认为比较有价值的代码,出现学 ...
- 三分钟深入TT猫之故障转移
结束了一周繁忙的工作,趁着周末,小编手中的键盘早已饥渴难耐了,想知道上期省略号中发生了什么有趣的故事么?且听小编娓娓道来,结尾有彩蛋. 目录 风月前场 梦回现实 模拟老鸨 会话机制 故障转移 总结 风 ...
- Java:接口继承接口 (多继承机制)
在看API文档时,突然发现一个接口可以是其他接口的子接口,这说明接口之间会存在继承的关系.查找了相关的资料,做一个总结. 是继承还是实现 首先要搞清楚接口之间的关系使用的关键字是extends还是im ...
- bootStrap事例代码
最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...
- java自然语言理解demo,源码分享(基于欧拉蜜)
汇率换算自然语言理解功能JAVA DEMO >>>>>>>>>>>>>>>>>>>&g ...
- 我的Spring学习记录(三)
学习了AOP之后就可以应用一下了,所以这次我们了解一下Spring的声明式事务. 事务在我们的很多方面都可以体现,就拿我们平时的买卖活动,或者是银行的转账来说,这些活动要么是成功,要么是失败,比如:张 ...
- 记忆搜索与动态规划——DP背包问题
题目描述 01背包问题 有n个重量和价值分别为\(w_i,v_i\)的物品.从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值中总和的最大值. 限制条件 1 <= n <= 10 ...