如何禁止在Python中创建新的类属性?

螺旋球

这可能是一个非常基本的问题,但对于SO或其他地方,我找不到任何帮助...

如果采用内置类,例如intlist,则无法为它们创建其他类属性(这显然是一种理想的行为):

>>> int.x = 0
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    int.x = 0
TypeError: can't set attributes of built-in/extension type 'int'

但是如果您创建自己的自定义类,则默认情况下不会启用此限制,因此任何人都可以在其中创建其他类属性

class foo(object):
    a = 1
    b = 2

>>> foo.c = 3
>>> print(foo.a, foo.b, foo.c)
1 2 3

我知道__slots__class属性是禁止创建不需要的实例属性的一种解决方案,但是像内置类那样,禁止有害的属性的过程又是什么呢?

亚历克西斯·布伦农

我认为您应该使用元类它可以定义类的行为,而不是其实例。

Patrick Haugh的评论使用以下代码段引用了另一个SO答案

class FrozenMeta(type):
    def __new__(cls, name, bases, dct):
        inst = super().__new__(cls, name, bases, {"_FrozenMeta__frozen": False, **dct})
        inst.__frozen = True
        return inst
    def __setattr__(self, key, value):
        if self.__frozen and not hasattr(self, key):
            raise TypeError("I am frozen")
        super().__setattr__(key, value)

class A(metaclass=FrozenMeta):
    a = 1
    b = 2

A.a = 2
A.c = 1 # TypeError: I am frozen

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 Python 中创建类之间的共享类属性

来自分类Dev

在python中创建和调用类属性

来自分类Dev

在Python中为类属性创建“标准属性”

来自分类Dev

何时创建python类属性

来自分类Dev

何时创建python类属性

来自分类Dev

如何在Python中修改实例属性而不是类属性

来自分类Dev

如何从 Python 中的类中访问类属性

来自分类Dev

如何继承类属性Python

来自分类Dev

在Python中调用类属性

来自分类Dev

在python中如何处理可变的类属性

来自分类Dev

如何在Python的Decorator中访问类属性?

来自分类Dev

如何在Python Mockito中模拟类属性

来自分类Dev

如何在python中为类属性添加方法?

来自分类Dev

如何在python中获取类属性(Django模型)的类型

来自分类Dev

如何从CSS类属性创建变量?

来自分类Dev

在Scala中动态创建类属性

来自分类Dev

在Scala中动态创建类属性

来自分类Dev

Matplotlib图作为新的类属性。以后如何在命令中显示它?

来自分类Dev

在Java中,如何创建从不同枚举中选择的类属性?

来自分类Dev

如何在Python中保护类属性?

来自分类Dev

如何在类属性中存储函数?

来自分类Dev

如何计算C#中的类属性?

来自分类Dev

如何忽略Swagger中的类属性

来自分类Dev

如何在 Groovy 中打印类属性?

来自分类Dev

如何从嵌套的类属性中获取值

来自分类Dev

在Python中列出类属性及其类型

来自分类Dev

Python类中的类属性阴影

来自分类Dev

在Python中处理许多参数/类属性

来自分类Dev

在Python中命名常量类属性