请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Python 如何定义只读属性?【新手必学】

[复制链接]
查看: 113|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
80196
发表于 2019-12-5 12:36 | 显示全部楼层 |阅读模式


前言
本文的翰墨及图片根源于收集,仅供进修、交换操纵,不具有任何贸易用处,版权归原作者全数,若有题目请实时联系我们以作处置惩罚。
作者:Daniel2333
Python 如何定义只读属性?【新手必学】  游戏 1880991-20191205090423043-2130486408

假如还没学到属性题目,看不懂不怪你,可以先去小编的Python交换.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目,先系统进修下
Python是面向工具(OOP)的说话, 而且在OOP这条路上比Java走得更完全, 由于在Python里, 齐全皆工具, 包含int, float等底子数据典范.
在Java里, 若要为一个类界说只读的属性, 只需要将目标属性用private修饰, 然后只供给getter()而不供给setter(). 但Python没有private关键字, 怎样界说只读属性呢? 有两种方式, 第一种跟Java类似, 经过界说私有属性实现. 第二种是经过__setattr__.
经过私有属性

用私有属性+@property界说只读属性, 需要预先界说好属性名, 然后实现对应的getter方式.,假如对属性还不懂。那倡议你先去小编的Python进修.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目,先系统进修下!
  1. 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.__yif __name__ == "__main__":    v = Vector2D(3, 4)    print(v.x, v.y)    v.x = 8 # error will be raised.
复制代码
输出:
  1. (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__方式. 可经过以下代码考证:
  1. 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
复制代码
输出:
  1. setting 'new_field' = 1
复制代码

  • 1
所以呢, 只需要在__setattr__ 方式里挡一下, 便可以禁止属性值的设备, 可谓是釜底抽薪.
代码:
  1. # encoding=utf8class 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] = vif __name__ == '__main__':    obj = MyCls()    obj.any_other_property = 'any_other_property'    print(obj.any_other_property)    print(obj.readonly_property)    obj.readonly_property = 1
复制代码
输出:
  1. any_other_propertyreadonly_propertyTraceback (most recent call last):  File "...", line 21, in     obj.readonly_property = 1    ...  AttributeError: MyCls.readonly_property is READ ONL
复制代码
免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表