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

标签 python attributes

这可能看起来是一个非常基本的问题,但我在 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 属性是禁止创建不需要的 的一种解决方案(除其他外)实例属性,但是禁止不需要的过程是什么类(class)属性,就像在内置类中所做的那样?

最佳答案

我觉得你应该玩metaclasses .它可以定义你的类的行为而不是它的实例。

来自 Patrick Haugh 的评论指另一个 SO answer使用以下代码片段:

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

关于python - 如何禁止在 Python 中创建新的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59361832/

相关文章:

python - 将类属性别名为函数

javascript - 选项[options.length] 不起作用

c# - 包装函数的属性?

python - django 中的自定义信号

python - 如何缩小图像搜索范围以进行模板匹配?

python - 在 Pytest 中测试 AWS s3 PUT 和下载

javascript - 如何获取属性值

c# - 枚举标志属性 C#

python - 灰度图像到 NumPy 数组进行傅里叶变换

python - 如果首选 names_with_underscores,为什么使用 unittest2 方法 camelCase?