如何用Python实现定义只读属性的技巧?

2026-05-29 03:411阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计573个文字,预计阅读时间需要3分钟。

如何用Python实现定义只读属性的技巧?

Python 是面向对象(OOP)的语言,在 OOP 领域上比 Java 更底层。在 Python 中,一切皆对象,包括 int、float 等基本数据类型。而在 Java 中,若要定义一个只有读权限的类,需要将目标属性设置为 private。

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

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

通过私有属性

Python里定义私有属性的方法见 www.jb51.net/article/181953.htm.

用私有属性+@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.

输出:

如何用Python实现定义只读属性的技巧?

(3.0, 4.0) Traceback (most recent call last): File ...., line 16, in <module> 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 <module> obj.readonly_property = 1 ... AttributeError: MyCls.readonly_property is READ ONLY

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

本文共计573个文字,预计阅读时间需要3分钟。

如何用Python实现定义只读属性的技巧?

Python 是面向对象(OOP)的语言,在 OOP 领域上比 Java 更底层。在 Python 中,一切皆对象,包括 int、float 等基本数据类型。而在 Java 中,若要定义一个只有读权限的类,需要将目标属性设置为 private。

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

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

通过私有属性

Python里定义私有属性的方法见 www.jb51.net/article/181953.htm.

用私有属性+@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.

输出:

如何用Python实现定义只读属性的技巧?

(3.0, 4.0) Traceback (most recent call last): File ...., line 16, in <module> 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 <module> obj.readonly_property = 1 ... AttributeError: MyCls.readonly_property is READ ONLY

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