类的封装(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底层存 ...
随机推荐
- 学习目标或者作业的制定(SMART原则)
以下文字摘自邹欣老师的博客 很高兴看到学生们都写了自己的目标: http://www.cnblogs.com/deng201421123059/p/6435346.html 不得不说,有些同学的目标太 ...
- #黑客攻防实战详解#[Chapter 1]
1.1 ①配置模拟入侵环境 ②配置网络拓扑
- Struts2第二篇【开发步骤、执行流程、struts.xml讲解、defalut-struts讲解】
前言 我们现在学习的是Struts2,其实Struts1和Struts2在技术上是没有很大的关联的.Struts2其实基于Web Work框架的,只不过它的推广没有Struts1好,因此就拿着Stru ...
- 7z命令行 极限压缩指令
摘抄自http://www.cnblogs.com/qanholas/archive/2011/10/03/2198487.html 7za a -t7z bag.7z "/home/fil ...
- 浅谈Linux虚拟内存
我的orangepi内存很少,所以我打算给它弄个虚拟内存 首先建立一个1G的空文件: dd if=/dev/zero of=/home/swapfile bs=64M count=16 格式化为swa ...
- 添加事务后 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type available
今天遇到了一个奇怪的问题 在没添加事务之前 所有的代码都是好的 , 当我添加了事务之后, 代码报错 org.springframework.beans.factory.NoSuchBeanDef ...
- Windows和Linux查看和更改mysql连接池
Windows: 查看: 进入mysql 输入:show variables like '%max_connections%'; 更改: 进入MYSQL安装目录 打开MYSQL配置文件 my.ini ...
- 多年iOS开发经验总结
总结了几个月的东西终于能和大家分享了,不多说,直接看东西! 1.禁止手机睡眠 1 [UIApplication sharedApplication].idleTimerDisabled = YES; ...
- python和C语言混编的几种方式
Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Pytho ...
- 个人从源码理解JIT模式下angular编译AppModule的过程
承接上文.笔者之前将一个angular项目的启动过程分为了两步: 创建平台得到 PlatformRef ,以及执行平台引用提供的方法编译根模块 AppModule .本文就将着眼于创建好的平台,从an ...