封装

封装程序的主要原因:保护隐私;而封装方法的主要原因是:隔离复杂的执行过程

  • 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)的更多相关文章

  1. python 类的封装/property类型/和对象的绑定与非绑定方法

    目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...

  2. Python类总结-封装(Property, setter, deleter)

    Property #property #内置装饰器函数,只在面向对象中使用 from math import pi class Circle: def __init__(self,r ): self. ...

  3. 抽象类,接口类,封装,property,classmetod,statimethod

    抽象类,接口类,封装,property,classmetod,statimethod(类方法,静态方法) 一丶抽象类和接口类 接口类(不崇尚用) 接口类:是规范子类的一个模板,只要接口类中定义的,就应 ...

  4. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

  5. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  6. iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理

    一.旋转动画的实现 二.音乐工具类的封装 -- 返回所有歌曲,返回当前播放歌曲,设置当前播放歌曲,返回下一首歌曲,返回上一首歌曲方法的实现 头文件 .m文件 #import "ChaosMu ...

  7. Java—类的封装、继承与多态

    一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> ...

  8. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  9. 025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装

    上一篇文章提过,HSSF的用户模式会导致读取海量数据时很慢,所以我们采用的是事件驱动模式.这个模式类似于xml的sax解析.需要实现一个接口,HSSFListener接口. 原理:根据excel底层存 ...

随机推荐

  1. 201521123059 《Java程序设计》第三周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  2. 201521123080《Java程序设计》第2周学习总结

    1.本周学习总结 a.学习了如何建立远程仓库和本地仓库并建立连接. b.学习了一些基础语法. 2.书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对象的源代码(截图)?分析Str ...

  3. 201521123048 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? ...

  4. 201521123104 《Java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1. finally(题目4-2) 1.1 截图你的提交结果(出现学号) 1.2 4-2中f ...

  5. 【干货】教你如何利用fullPage.js以及move.js插件打造高端大气的网站效果!

    前言: 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次. 在学习过jQuery插件之后,才发现之前的很多网站特效完全可 ...

  6. linux下修改rm命令防止误删除

    前言:相信很多朋友都遇到过在linux下用rm命令误删除文件的时候,此刻的心中仿佛有无数的羊驼在奔腾.那么怎么防止这种情况发生呢?当然是有方法的,我们可以写一个shell脚本,改变一下rm命令的作用. ...

  7. 存储过程重置SEQUENCE值从新开始。

    CREATE OR REPLACE PROCEDURE RESET_SEQUENCE( v_SeqName IN VARCHAR2, v_sqlcode OUT NUMBER, v_sqlerrm O ...

  8. 模拟实现一个ATM+购物商城程序

    记得上次小编上传了一个购物车程序,这次呢稍微复杂一点,还是那句话,上传在这里不是为了炫耀什么,只是督促小编学习,如果大神有什么意见和建议,欢迎指导.(PS:本次主要参考学习为主,自己原创的很少) 要求 ...

  9. Struts2第四篇【请求数据自动封装、Action得到域对象】

    前言 前三篇的Struts博文基本把Struts的配置信息讲解完了-..本博文主要讲解Struts对数据的处理 一般地,我们使用Servlet的时候都是分为几个步骤的: 得到web层的数据.封装数据 ...

  10. this的四种绑定形式

    一 , this的默认绑定 当一个函数没有明确的调用对象的时候,也就是单纯作为独立函数调用的时候,将对函数的this使用默认绑定:绑定到全局的window对象. 一个例子 function fire ...