当前位置: 首页 > 知识库问答 >
问题:

Python创建只读包装类而不修改包装类

长孙永思
2023-03-14

我有一个如下所示的基类:

class Base:
    def __init__(self, prop):
        self.prop = prop

我想创建一个具有以下功能的只读包装类ReadOnlyWrapper

# Create instance using __init__ of base class.
readonly_instance = ReadonlyWrapper()

# I can access properties
prop = readonly_instance.prop

# This should raise a PermissionError
readonly_instance.prop = 23

更确切地说,我希望类的所有字段都是只读的,但只有在调用__init__之后,否则类就不能在构造函数本身中构造。我知道可以使用属性装饰器来完成,但我不想把所有属性都变成属性。

共有1个答案

松锐藻
2023-03-14

null

class ReadonlyWrapper(Base):
    _initialized = False

    def __init__(self, *args, **kwargs):
        super(ReadonlyWrapper, self).__init__(*args, **kwargs)
        self._initialized = True

    def __setattr__(self, key, value) -> None:
        if self._initialized:
            raise PermissionError()
        else:
            super().__setattr__(key, value)

_initialized设置为true后,任何设置属性的尝试都将引发PermissionError

 类似资料:
  • Java9的一个新特性是不推荐使用包装对象的构造函数。创建新包装对象的唯一方法是使用它们的静态方法。例如,对于整数对象,为-128和127之间的值实现缓存,并在每次调用时返回相同的引用。 正如类的API所说:“静态工厂值of(int)通常是一个更好的选择,因为它可能会产生更好的空间和时间性能。”JLS说:“给定相应的基元类型的值,通常不需要构造这些box类的新实例。构造的建议替代方法是自动装箱或静

  • 如果想要定义安装左侧的图片,请在 ; MUI 预定义常量 !define MUI_ABORTWARNING !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico

  • 本小节我们将学习 Java 的包装类,我们将了解到什么是包装类,为什么需要包装类,Java 提供的包装类有哪些,各种包装类的常用方法和常量介绍,什么是装箱操作以及什么是拆箱操作等内容。 1. 什么是包装类 Java 有 8 种基本数据类型,Java 中的每个基本类型都被包装成了一个类,这些类被称为包装类。 包装类可以分为 3 类:Number、Character、Boolean,包装类的架构图如下

  • 问题内容: 我有使用Maven创建jar文件的要求,但是需要使用“ foobar”扩展名将它们安装到存储库中,如果它们可以具有自己的打包类型,那么这很好,以便我们可以通过打包来识别这些工件。 我可以设置新的包装类型吗? 问题答案: 要做到像你描述,创建包装Maven项目 罐子 (如说在这里,因为不会有魔力的定义)。在src / main / resources / META-INF / plexu

  • CGO是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。CGO不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。一个C++类的构造函数在编译为目标文件时如何生成链接符号名称、方法在不同平台甚至是C++的不同版本之间都是不一样的。但是C++是兼容C语言,所以我们可以通过增加一组C语言函数接口作为C++类和CGO之间的桥梁,这样就可以间接地实现C++和Go之间的互

  • 我想创建一个组件,它是一个具有自定义样式的DIV:背景色蓝色。在那之后,我想引用它并添加文本作为子对象。我正在尝试这样做: 包装器: 我是这样实例化的: 实例: 但它不起作用。我怎么能这样做?。非常感谢。