Python特殊属性property原理及使用方法解析
1 什么是特性property
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
import math class Circle: def __init__(self,radius): #圆的半径radius self.radius=radius @property def area(self): return math.pi * self.radius**2 #计算面积 @property def perimeter(self): return 2*math.pi*self.radius #计算周长 c=Circle(10) print(c.radius) print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值 print(c.perimeter) #同上 ''' 输出结果: 314.1592653589793 62.83185307179586 '''
注意:此时的特性arear和perimeter不能被赋值
c.area=3 #为特性area赋值 ''' 抛出异常: AttributeError: can't set attribute '''
2 为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
除此之外,看下
ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
【private】
这种封装对谁都不公开
python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现
class Foo: def __init__(self,val): self.__NAME=val #将所有的数据属性都隐藏起来 @property def name(self): return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置) @name.setter def name(self,value): if not isinstance(value,str): #在设定值之前进行类型检查 raise TypeError('%s must be str' %value) self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME @name.deleter def name(self): raise TypeError('Can not delete') f=Foo('egon') print(f.name) # f.name=10 #抛出异常'TypeError: 10 must be str' del f.name #抛出异常'TypeError: Can not delete'
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Python 从attribute到property详解
字面意思上的区别 Attribute与property, 都可翻译成属性. 虽然无论是在中文中还是英文中 它们的意思都几乎一样, 但仍有些许差别. Google了好几下, 找到了一个看起来比较靠谱的解释: According to Webster, a property is a characteristic that belongs to a thing's essential nature and may be used to describe a type or species. An a
-
Python如何使用@property @x.setter及@x.deleter
@property可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的. 只有@property表示只读. 同时有@property和@x.setter表示可读可写. 同时有@property和@x.setter和@x.deleter表示可读可写可删除. 代码如下 class student(object): #新式类 def __init__(self,id): self.__id=id @property #读 d
-
Python @property及getter setter原理详解
@property作用: python的@property是python的一种装饰器,是用来修饰方法的. 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改. 1.修饰方法,让方法可以像属性一样访问. class DataSet(object): @property def method_with_property(self): ##含有@property return 15 def m
-
Python @property装饰器原理解析
这篇文章主要介绍了Python @property装饰器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.通过@property装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对"()"小括号. class Person: def __init__(self, name): self.__name = name @property def say(self): return self.__name xioabai
-
Python内置函数property()如何使用
代码 class Shuxing(): def __init__(self, size = 10): self.size = size def getSize(self): print('getSize') return self.size def setSize(self, value): print('setSize') self.size = value def delSize(self): print('delSize') del self.size x = property(getSi
-
Python @property原理解析和用法实例
这篇文章主要介绍了Python @property原理解析和用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property闪亮登场啦,巴拉巴拉能量--.. 用代码来举例子更容易理解,比如一个学生成绩表定义成这样 class Stude
-
Python 中@property的用法详解
在绑定属性时,如果我们直接把属性赋值给对象,比如: p = Person() p.name= 'Mary' 我们先看个详细的例子(注意双下划线name和age定义为私有变量): class Person(object): def __init__(self, name, age): self.__name = name self.__age = age def get_age_fun(self): return self.__age def set_age_fun(self, value): i
-
python中property属性的介绍及其应用详解
Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的用法1--装饰器方式 在类的实例方法上应用@property装饰器 class Test: def __init__(self): self.__num = 100 @property def num(self): print("--get--") return self.__num @n
-
Python特殊属性property原理及使用方法解析
1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circle: def __init__(self,radius): #圆的半径radius self.radius=radius @property def area(self): return math.pi * self.radius**2 #计算面积 @property def perimeter(self): return 2*math.pi*
-
python中栈的原理及实现方法示例
本文实例讲述了python中栈的原理及实现方法.分享给大家供大家参考,具体如下: 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序. 由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)
-
Python中顺序表原理与实现方法详解
本文实例讲述了Python中顺序表原理与实现方法.分享给大家供大家参考,具体如下: Python中的顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术,具有顺序表的所有性质. tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似. list的基本实现技术 Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征: 基于下标(位置
-
Mysql临时表原理及创建方法解析
这篇文章主要介绍了Mysql临时表原理及创建方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 mysql 利用 temporary 关键字就可以创建出一个临时表.创建的这张表会在与服务器的会话终止时自动消失 语法:create temporary table tbl_name...; 规则:每个会话只能看到自己创建的临时表,不同的会话可以创建相同表名称的临时表.临时表的表名可以和永久表的名字相同. 好处:可以利用临时表保存一些临时数据,断
-
Python -m参数原理及使用方法解析
python -m xxx.py 作用是:把xxx.py文件当做模块启动 但是我一直不明白当做模块启动到底有什么用.python xxx.py和python -m xxx.py有什么区别! 自问自答: python xxx.py python -m xxx.py 这是两种加载py文件的方式: 1叫做直接运行 2把模块当作脚本来启动(注意:但是__name__的值为'main' ) 不同的加载py文件的方式,主要是影响--sys.path 这个属性.sys.path 就相当于liunx中的PATH
-
python实现AutoResetEvent类的阻塞模式方法解析
搞过C#多线程的人对其中的AutoResetEvent和ManualResetEvent这两个类都理解,其中的WaitOne()方法和Set()以及Reset()方法在线程同步当中用的是比较多的. AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式. ManualResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Se
-
PHP unset函数原理及使用方法解析
unset-释放给定的变量 说明 unset(mixed$var[,mixed$...] ) :void unset()销毁指定的变量. unset()在函数中的行为会依赖于想要销毁的变量的类型而有所不同. 如果在函数中unset()一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用unset()之前一样的值. <?php function destroy_foo() { global $foo; unset($foo); } $foo = 'bar'; destroy_foo(
-
Javascript Symbol原理及使用方法解析
Symbol是ES6中新引入的一种基本数据类型,在此之前JavaScript中已有几种基本数据类型: Numberg String Boolean Null Undefined Object 不同于其他基本类型的通俗易懂,Symbol 是什么和有什么用一直有些让人困惑. 什么是Symbol JavaScript标准中规定对象的key只能是 String 或 Symbol 类型,区别在于 String 类型的key可以重复而 Symbol 类型的key是唯一的.Symbol 的本质是表示一个唯一标
-
python中下标和切片的使用方法解析
下标 所谓下标就是编号,就好比超市中存储柜的编号,通过这个编号就能找到相应的存储空间. Python中字符串,列表,元祖均支持下标索引. 例如: # 如果想取出部分字符,可使用下标 name="abcd" print(name[0]) print(name[1]) print(name[2]) print(name[3]) # 输出结果为: # a # b # c # d 切片 切片是指对操作的对象截取一部分的操作,字符串,列表,元组均支持切片操作. 切片的语法:[起始:结束:步长]
-
Java常用线程池原理及使用方法解析
一.简介 什么是线程池? 池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用.java中有线程池.连接池等等.线程池就是在系统启动或者实例化池时创建一些空闲的线程,等待工作调度,执行完任务后,线程并不会立即被销毁,而是重新处于空闲状态,等待下一次调度. 线程池的工作机制? 在线程池的编程模式中,任务提交并不是直接提交给线程,而是提交给池.线程池在拿到任务之后,就会寻找有没有空闲的线程,有则分配给空闲线程执行,暂时没有则会进入等待队列,继续等待空闲线程.如果超出最
随机推荐
- 使用Navicat Premium将SQLServer数据导出为sql格式
- javascript学习笔记(五)原型和原型链详解
- 微信小程序 数据交互与渲染实例详解
- 应该如何构造复杂的正则表达式
- 批处理BAT实现正弦曲线和抛物线代码
- WordPress中开启多站点支持及Nginx的重写规则配置
- asp.net使用母版页中使用ajax脚本取数据
- 调整优化您的LAMP应用程序的5种简单方法
- Python编写生成验证码的脚本的教程
- 使用Nodejs连接mongodb数据库的实现代码
- 如何使用Maven管理项目?Maven管理项目实例
- c语言http请求解析表单内容
- 基于jQuery的仿flash的广告轮播
- jQuery层级选择器用法分析
- JS 自定义函数缺省值的设置方法
- 微信小程序五星评分效果实现代码
- 再谈反向链接,又学了东西
- java经典问题:连个字符串互为回环变位
- java多线程Thread的实现方法代码详解
- swift4.0实现视频播放、屏幕旋转、倍速播放、手势调节及锁屏面板等功能实例