当前位置: 首页 > 编程笔记 >

python防止随意修改类属性的实现方法

颜君浩
2023-03-14
本文向大家介绍python防止随意修改类属性的实现方法,包括了python防止随意修改类属性的实现方法的使用技巧和注意事项,需要的朋友参考一下

如果不想允许随意修改一个类的某个属性,常用的方法是使用property装饰器以及在属性前加下划线。

class V:
  def __init__(self, x): 
    self._x = x
  
  @property
  def x(self):
    return self._x 

虽然这样是没法直接修改x了,但还是可以通过_x很轻易地修改x。

>>>v = V(5)
>>>v.x
5
>>>v._x
5
>>>v.x = 4
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: cant set attribute
>>>v._x = 4
>>>v.x
4

万一哪天手抖了呢...

但如果使用双下划线——

class V:
  def __init__(self,x):
    self.__x = x

  @property
  def x(self):
    return self.__x

>>>v = V(5)
>>>v.__x = 4
>>>v.__x
4
>>>v.x
5

原因在于python的名称改写特性(name mangling)。python会将以双下划线开头的实例属性名前加上一个下划线和类名存入实例的__dict__属性中。

>>>v = V(5)
>>>v.__dict__
{'_V__x': 5}
>>>v.__x = 4
>>>v.__dict__
{'_V__x': 5, '__x': 4}

当然,修改v.x的值还是可以做到的的,只需通过修改v._V__x就可以了,不过误操作的可能性已经降低很多了。

p.s.类也有__dict__属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 如何修改/设置两个值? 主机IP地址 value =“ 0x00010a248921” “供应商ID” 值=“ 11” 我尝试访问失败, 目标: 我更希望看到一个lxml.objectify与一个Xpath解决方案,但我将接受其他基于lxml的解决方案。 文件小于100kB,因此速度/ RAM无关紧要。 问题答案:

  • 我正在实现一个kiosk模式应用程序,我已经成功地使应用程序全屏显示,在4.3之后没有状态栏出现,但在4.3和4.4中无法隐藏状态栏,因为当我们在屏幕顶部向下滑动时,状态栏会出现。 我已经试着在 在清单中指定全屏主题 设置窗口标志ie setFlags setSystemUi可视性 可能重复,但未找到具体解决方案 永久隐藏Android状态栏 最后的事情我想要的是,如何隐藏状态栏永久在一个活动??

  • 我有以上代码,为什么修改类属性影响实例属性?有人会说这是由于实例共享类属性,根据mro属性解析顺序是如此,但是这是在实例命名空间没有要搜索的属性时才会访问类的命名空间,在我的代码中,实例(shili)有自己的name属性,但为什么还是共享类属性呢?或者说这是其他什么问题,求大佬解答

  • 1、从内部增加和修改类属性 来,我们先来温习一下类的结构。 看着这个结构,提一个问题,如何修改类属性,也就是类里面的变量? 从类结构来看,我们可以猜测,从类方法来修改,也就是从类内部来修改和增加类属性。 看下具体的实例: 这里还是强调一下,例子还是要自己多写,不要只看,自己运行, 看效果。多想。 2、从外部增加和修改类属性 我们刚刚看了通过类方法来修改类的属性,这时我们看下从外部如何修改和增加类属

  • 修改属性(命令)是用于修改或更新特定类的属性的命令。修改属性意味着修改表格的字段。 在本章中,将学习如何更新属性。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 定义属性所属的类。 - 定义您想要更新的属性。 - 定义要更新的属性的属性。 - 定义您想要在属性上设置的值。 下表定义了用于更改属性的属性列表。 属性 类型 描述 LINKEDCLASS 字符串 定义链接的类名称

  • 除了在构造函数中指定材质,在网格被创建后,也能对材质进行修改: 例5.2.1 var material = new THREE.MeshLambertMaterial({ color: 0xffff00 }); var geometry = new THREE.CubeGeometry(1, 2, 3); var mesh = new THREE.Mesh(geometry, materi