Python是面向对象(OOP)的语言, 而且在OOP这条路上比Java走得更彻底, 因为在Python里, 一切皆对象, 包括int, float等基本数据类型.

在Java里, 若要为一个类定义只读的属性, 只需要将目标属性用private修饰, 然后只提供getter()而不提供setter(). 但Python没有private关键字, 如何定义只读属性呢? 有两种方法, 第一种跟Java类似, 通过定义私有属性实现. 第二种是通过__setattr__.

通过私有属性

用私有属性+@property定义只读属性, 需要预先定义好属性名, 然后实现对应的getter方法.

class Vector2D(object):

def __init__(self, x, y):

self.__x = float(x)

self.__y = float(y)

@property

def x(self):

return self.__x

@property

def y(self):

return self.__y

if __name__ == "__main__":

v = Vector2D(3, 4)

print(v.x, v.y)

v.x = 8 # error will be raised.

输出:

(3.0, 4.0)

Traceback (most recent call last):

File ...., line 16, in

v.x = 8 # error will be raised.

AttributeError: can't set attribute

可以看出, 属性x是可读但不可写的.

通过__setattr__

当我们调用obj.attr=value时发生了什么?

很简单, 调用了obj的__setattr__方法. 可通过以下代码验证:

class MyCls():

def __init__(self):

pass

def __setattr__(self, f, v):

print 'setting %r = %r'%(f, v)

if __name__ == '__main__':

obj = MyCls()

obj.new_field = 1

输出:

setting 'new_field' = 1

所以呢, 只需要在__setattr__ 方法里挡一下, 就可以阻止属性值的设置, 可谓是釜底抽薪.

代码:

# encoding=utf8

class MyCls(object):

readonly_property = 'readonly_property'

def __init__(self):

pass

def __setattr__(self, f, v):

if f == 'readonly_property':

raise AttributeError('{}.{} is READ ONLY'.\

format(type(self).__name__, f))

else:

self.__dict__[f] = v

if __name__ == '__main__':

obj = MyCls()

obj.any_other_property = 'any_other_property'

print(obj.any_other_property)

print(obj.readonly_property)

obj.readonly_property = 1

输出:

any_other_property

readonly_property

Traceback (most recent call last):

File "...", line 21, in

obj.readonly_property = 1

...

AttributeError: MyCls.readonly_property is READ ONLY

以上这篇Python 定义只读属性的实现方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

python只读属性怎么设置_Python 定义只读属性的实现方式相关推荐

  1. python坐标轴刻度设置_Python Matplotlib 设置x/y坐标轴刻度

    刻度设置 参考文档: xticks 命令 yticks 命令 以xticks为例: matplotlib.pyplot.xticks(args, *kwargs) 获取或者设置当前刻度位置和文本的 x ...

  2. python权限管理设置_python权限管理框架

    Python生成管理员权限的可执行程序 如何使用pyinstaller或者其他生成一个有管理员权限的可执行程序,生成的我也遇到这个问题了. Python权限修饰正确的是? A. 标识符开头无下划线,该 ...

  3. python画图颜色设置_python画图常规设置方式

    python绘图的包大家应该不会陌生,但是,对图的常规设置不一定会知道(其实自己也是才知道的),比如:坐标轴的字体大小.颜色设置:标题的字体颜色大小设置:线的粗细.颜色:图片风格的设置等.了解这些常规 ...

  4. python prettytable格式设置_Python prettytable的使用方法

    原博文 2015-10-22 19:09 − ###Python prettytable的使用方法 prettytable可以整齐地输出一个表格信息: +-----------+------+---- ...

  5. python只读属性怎么设置_python 设置只读属性(property或者__setter__方法)

    python设置只读属性的方式有两种 1.通过property装饰器和私有属性配合完成只读属性 2.借助__setter__方法,设置逻辑阻止赋值 方式一: class Task(object): d ...

  6. python画图颜色设置_python画图--输出指定像素点的颜色值方法

    python画图--输出指定像素点的颜色值方法 如下所示: # -*- coding: utf-8 -*- #--------------------------------------------- ...

  7. python画图颜色设置_python画图自定义colorbar

    作者:ahworld 链接:python画图自定义colorbar 来源:微信公众号-seqyuan 著作权归作者所有,任何形式的转载都请联系作者. 自定义colorbar包含两方面: 自定义colo ...

  8. python坐标轴刻度设置_Python之坐标轴刻度细化、坐标轴设置、标题图例添加

    原博文 2018-03-20 16:41 − 学习python中matplotlib绘图设置坐标轴刻度.文本 http://www.jb51.net/article/134638.htm Python ...

  9. 定义python的色条_Python:定义颜色曲线部分

    我试图复制以下数字: 颜色渐变从蓝色变为红色,表示材质的状态.我现在可以绘制每条曲线.每条直线由两点定义,然后使用pyplot(matplotlib库)简单地绘制.对于如何计算关联值,我也有一个清晰的 ...

最新文章

  1. QCon北京2015:18个热门专题,出品人全部确认,新版网站上线
  2. 鸿蒙系统明年上市巧,鸿蒙系统官网下载-鸿蒙系统官网下载手机版 v2.0下载-955游戏网...
  3. Lesson 6. Scikit-Learn使用与进阶
  4. 中国SaaS死或生之四:卧榻之侧,是谁在捅刀 SaaS?
  5. java 部分正确性_深入理解java快速排序的正确性
  6. 查看网卡[网络接口]
  7. linux 向程序发送信号,Linux下的信号处理
  8. CVPR 9999 Best Paper——《一种加辣椒的番茄炒蛋》
  9. Mac下的Docker及Kubernetes(k8s)本地环境搭建与应用部署、管理界面kubernetes-dashboard
  10. React-Error
  11. 电信猫不折旧,用了几年还是原价
  12. 一个企图用代码偷懒计算测量学闭合导线各项数据的屑是否有错
  13. SQL数据分析常用案例总结
  14. cmd中start 命令用法
  15. 黑少微服务商店实战经验分享:从单体式架构迁移到微服务架构
  16. 黑盒测试 之 因果图法
  17. 大咖访谈丨金星分享2020年直播数据,助农产品如何走上产销快车道
  18. 听不够的三国,淡淡的乡愁
  19. Paho Java Client 连接阿里云物联网平台
  20. kali密码破解笔记

热门文章

  1. 计算机技术在生物教学中应用,信息技术在生物课堂教学中的应用
  2. gregorian(格里高力)历转换公历
  3. 如何在flash中实现播放控制?
  4. 关于uni-app的ui库、ui框架、ui组件
  5. 【Java】JAVA枚举类型
  6. IT学习的网站和工具
  7. The Shawshank Redemption-7
  8. SharpDevelop 简介
  9. 米尔基于ARM架构核心板的国产化EtherCAT主站控制器解决方案
  10. e480换高分屏_ThinkPadE480电脑(i5-8250u 8G内存 256G固态 高分屏0QCD 14英寸) 京东5699元...