property属性

property实际是setter getter deleter是集合体,并不是一个单独的方法

import math  # 使用的库

class Circle:
def __init__(self,radius): #定义圆的半径
self.radius = radius @property # area = property(area) #
def area(self):
return math.pi * self.radius**2 # 在类内部的函数,返回值 @property
def peirimeter(self):
return 2*math.pi*self.radius c1= Circle(5) # 对类实例化 产生一个对象
print(c1.radius) # 打印的是半径的值
print(c1.area) # 这里相当于是直接使用了一个属性,并没有使用绑定方法
print(c1.peirimeter)

结果:

5

78.53981633974483

31.41592653589793

注意:

c.area是不能赋值的,虽然我们能够当做看似通过属性进行调用,实际是不是的

c1.area = 1

结果是:

AttributeError: can't set attribute

会抛出错误

下面是一个测试:

print(type(Circle.area)) #此时类是不能使用area函数的,结果是class property

print(Circle.area) # 结果是property object at 0x00000000006AB5E8

为什么要用property

将一个函数的类定义成property特性后,对象使用object.name,无法知道这个name是函数计算出来的,这种特性的使用方式遵循统一访问原则

面向对象中有三种类:

public --就是公开类

protected -- 父类

private -- 私有类

但是python的class机制并没有把这三种语法,像C++提供的是set和get方法,Python中是通过property方法提供

class People:
def __init__(self,name,SEX):
self.name = name
self.__sex = SEX # 进行封装 @property
def sex(self):
return self.__sex # 这里的返回值是真实的值 p1 = People('aaa','male')
print(p1.name) # 雷士通过属性的方式进行了调用
print(p1.sex)

结果:

male

aaa

通过属性的的方式是通过property的方式能够object.name的方式,这里就是用来实例化的p1.name p1.sex来是实现

但是这种属性并不是真正的属性,不能通过赋值的方式修改,后期需要进行修改用到了setter方法

setter方法是用了被property装饰器后的函数名命名了一个新的装饰器

class People:
def __init__(self,name,SEX):
self.name = name
self.__sex = SEX # 进行封装 @property
def sex(self):
return self.__sex # 这里的返回值是真实的值 @sex.setter # 想要对上面得函数属性进行修改
def sex(self,value): # value的值是是想要进行修改的参数
# print('============') # 测试用
print(self,value)
self.__sex = value # 真实的值是存在与__sex中,赋值给value p1 = People('aaa','male') # 实例化
p1.sex = 'femele' # 这里就是通过类似赋值的方式进行了修改
print(p1.sex) # 新的查看

结果:

famele

上面的关键是@sex.setter重新命名了一个新的装饰器,装饰器的名字是sex,它的方法是setter。p1.sex = 'femele' 这这执行的时候首先从property下面的sex.__sex,这里存放的是真实的sex的值,所以的赋值只能在这里

通过抛出异常,限制输入的参数必须是字符串

class People:
def __init__(self,name,SEX):
self.name = name
# self.__sex = SEX # 进行封装
self.sex = SEX # 这里直接初始化的时候就会进入@sex.seter @property
def sex(self):
return self.__sex # 这里的返回值是真实的值 @sex.setter # 想要对上面得函数属性进行修改
def sex(self,value): # value的值是是想要进行修改的参数
# print('============') # 测试用
print(self,value)
if not isinstance(value,str): # 判断修改的不是字符串,抛出异常
raise TypeError("male 必须是字符串类型")
self.__sex = value # 真实的值是存在与__sex中,赋值给value p1 = People('aaa','male') # 实例化
p1.sex = 'femele'
print(p1.sex)

上面的修改是在setter中在修改赋值之前增加了异常处理,如果输入的不是字符串,就会抛出异常,但是这个只是在实例化赋值(p1.sex = 123)时候用才会抛出异常,在类的初始化的时候直接就self.sex=SEX,p1 = People('aaa',123) # 实例化最初的时候就会抛出异常

删除操作

class People:
def __init__(self,name,SEX):
self.name = name
# self.__sex = SEX # 进行封装
self.sex = SEX @property
def sex(self):
return self.__sex # 这里的返回值是真实的值 @sex.setter # 想要对上面得函数属性进行修改
def sex(self,value): # value的值是是想要进行修改的参数
# print('============') # 测试用
print(self,value)
if not isinstance(value,str): # 判断修改的不是字符串,抛出异常
raise TypeError("male 必须是字符串类型")
self.__sex = value # 真实的值是存在与__sex中,赋值给value @sex.deleter
def sex(self):
del self.__sex # 同样删除的是真实存放内容的__sex p1 = People('aaa','male')
print(p1.sex)
del p1.sex # 删除p1的sex属性

Python封装补充的更多相关文章

  1. python 知识点补充

    python 知识点补充 简明 python 教程 r 或 R 来指定一个 原始(Raw) 字符串 Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字.字符串与 函数 ...

  2. python封装configparser模块获取conf.ini值(优化版)

    昨天晚上封装了configparser模块,是根据keyname获取的value.python封装configparser模块获取conf.ini值 我原本是想通过config.ini文件中的sect ...

  3. 使用boost.python封装C++库

    使用boost.python封装C++库 C++以高性能著称,但是编写较为复杂.而简洁是Python的强项.如果能珠联璧合,就能发挥两家之长.本文尝试用boost库的python模块封装C++ 前期准 ...

  4. PYTHON 100days学习笔记007-2:python数据类型补充(2)

    目录 day007:python数据类型补充(2) 1.Python3 元组 1.1 访问元组 1.2 删除元组 1.3 元组运算符 1.4 元组索引,截取 1.5 元组内置函数 2.python3 ...

  5. PYTHON 100days学习笔记007-1:python数据类型补充(1)

    目录 day007:python数据类型补充(1) 1.数字Number 1.1 Python 数字类型转换 1.2 Python 数字运算 1.3 数学函数 1.4 随机数函数 1.5 三角函数 1 ...

  6. 【AMAD】python-magic -- libmagic的python封装

    简介 动机 作用 用法 个人评分 简介 libmagic的python封装 动机 封装libmagic,使用python代码获取文件类型. 作用 libmagic通过文件头部,来确定文件的类型. 用法 ...

  7. python 封装底层实现原理

    事实上,python封装特性的实现纯属"投机取巧",之所以类对象无法直接调用私有方法和属性,是因为底层实现时,python偷偷改变了它们的名称. python在底层实现时,将它们的 ...

  8. Python封装应用程序的最佳项目结构是什么?

    Python封装应用程序的最佳项目结构是什么? 转载来源于stackoverflow:https://stackoverflow.com/questions/193161/what-is-the-be ...

  9. python 封装、绑定

    目录 python 封装.绑定 1.数据.方法的封装 2.隐藏属性 3.开放接口 4.绑定方法 1.对象的绑定 2.类的绑定(classmethod) 3.非绑定方法(staticmethod) 4. ...

随机推荐

  1. 利用URL重写隐藏复杂的URL

    第一步:模拟映射页面 我们想在一个页面上点击guid.html链接,跳转到比较复杂URL的guid_{492f3e0b-848e-11da-9550-00e08161165f}.html页面.即定义一 ...

  2. Redis在windows实现将数据缓存起来定时更新读取

    实现接口的读取存放在内存中,实现了Web网站直接读取内存数据,大大的减少了访问接口带来的等待时间,这个功能是比较实用的 需要下载一下‘类库’及‘Redis-x64-3.2.100程序包’ 百度云材料下 ...

  3. AI决策算法 之 GOAP (二)

    http://blog.csdn.net/lovethRain/article/details/67634803 GOAP 的主要逻辑: 1.Agent的状态机初始化Idle状态 2.Idel状态根据 ...

  4. Unity手游之路自动寻路Navmesh之入门

    http://blog.csdn.net/janeky/article/details/17457533 现在的大部分mmo游戏都有了自动寻路功能.点击场景上的一个位置,角色就会自动寻路过去.中间可能 ...

  5. AcDbCurve of AcDbEntity

    AcDb2dPolyline AcDb3dPolyline AcDbArc AcDbCircle AcDbEllipse AcDbLeader AcDbLine AcDbPolyline AcDbRa ...

  6. css圆角不圆和1px方案

    1.圆角不圆 比如需要我们画一个 r 为 5px 的圆,如果我们使用 rem 作为单位,我们很快会发现在一些机型上的图案不圆,会呈现椭圆形.这是由于 rem 转 px 会存在精度丢失问题. 所以这个时 ...

  7. 题解 P1854 花店橱窗布置

    把二维压成一维的DP了解一下... 传送门 (以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha) 显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置 ; ...

  8. 30道python真实面试题(搜集到的,看看其实都是基础)

    1.一行代码实现1-100之间和 In [1]: sum(range(0,101)) Out[1]: 5050 2.如何在一个函数内部修改全局变量 利用global修改全局变量 In [2]: a = ...

  9. reaver 破解wifi

    1. 无线网卡设置为监控模式 airmon-ng start wlan0 2. 获取附近路由信息 airodump-ng wlan0mon 3. 使用reaver破解wifi reaver -i wl ...

  10. 使用docker save load 的时候的一个小问题

    当你使用docker save image_id > aa.tar ; 然后再使用 docker load < aa.tar 时, 你会发现此时导入的镜像的repository和 tag ...