当前位置: 首页 > 面试题库 >

禁止在__init__之外创建新属性

能烨华
2023-03-14
问题内容

我希望能够创建一个用Python初始化的类(在Python中),该类__init__不接受新属性,但接受对现有属性的修改。我可以通过几种方法来做到这一点,例如,使用__setattr__诸如

def __setattr__(self, attribute, value):
    if not attribute in self.__dict__:
        print "Cannot set %s" % attribute
    else:
        self.__dict__[attribute] = value

然后__dict__直接在内部进行编辑__init__,但是我想知道是否存在“正确”的方法?


问题答案:

我不会__dict__直接使用,但是您可以添加一个函数来显式“冻结”实例:

class FrozenClass(object):
    __isfrozen = False
    def __setattr__(self, key, value):
        if self.__isfrozen and not hasattr(self, key):
            raise TypeError( "%r is a frozen class" % self )
        object.__setattr__(self, key, value)

    def _freeze(self):
        self.__isfrozen = True

class Test(FrozenClass):
    def __init__(self):
        self.x = 42#
        self.y = 2**3

        self._freeze() # no new attributes after this point.

a,b = Test(), Test()
a.x = 10
b.z = 10 # fails


 类似资料:
  • 我有基本授权,它基于Spring启动安全性: 当我尝试在授权后添加新帖子时,我会收到这条消息: 在我的控制器中: 然而,读操作从我的控制器工作得很好,但积垢操作我没有访问权。 我的依赖性如下: 知道吗?提前谢谢!

  • 执行失败:PUT在:https://kubernetes.default.svc/apis/apps/v1beta1/namespaces/itsma1/statefulsets/pro-rabbitmq。消息:statefulset.apps“Pro-RabbitMQ”无效:spec:Piopbed:禁止更新“replicas”、“template”和“update strategy”以外的字段

  • 问题内容: 问题 我想在Java中创建一个用户定义函数,可以将其称为Apache Spark运算符链中的Java方法。我在查找不需要UDF存在于SQL查询中的Java示例时遇到了麻烦。 版本号 Java 8 斯卡拉2.10.6 为Hadoop 2.6.0预先构建的Apache Spark 1.6.0 我尝试过的方法 我可以用Java成功创建UDF。但是,除非在SQL查询中,否则无法使用它: 我被困

  • 我正在设置一个 Keycloak 实例以使用包含Spring安全性的 spring 启动应用程序。我使用邮递员来测试服务。我从获取新的访问令牌开始,工作正常。当我对安全endpoint进行 HTTP GET 调用时 - 一切正常,员工返回。但是当我对安全endpoint进行 HTTP POST/PUT/DELETE 调用时,Keycloak 说错误 403 禁止。请看一看,告诉我出了什么问题。 我

  • 当我试图构建一个Spring启动项目时,我得到了一个特定存储库的403个禁止错误。这将导致构建失败。 附属国: 错误: 我检查了Maven存储库,它被称为里程碑存储库。不知道该怎么办,请帮我解决这个问题。

  • Spring我是新来的。我试图在我的数据库中添加一个新目标。在我添加spring security之前,它是有效的,但现在如果我单击添加新目标,我有一个问题: 出现意外错误(类型=禁止,状态=403)。被禁止的 我的goat-add.html: WebSecurity配置类: 我的控制器: 我读到这个问题可以是如果不使用csrf,但我不明白我怎么能解决它。 所有代码:https://github.