防止为类或模块创建新属性

RoQ*_*riX 3 python

我看到这个问题关于SO Prevent在init之外创建新属性,它展示了如何防止向类的对象添加新属性。

我希望整个类甚至整个加载的模块具有相同的行为。

示例类:

class Klass:
     a = 0
     b = 1
Run Code Online (Sandbox Code Playgroud)

另一个模块:

from Klass import Klass

Klass.c = 2 # this should raise an error
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Pat*_*ugh 5

如果您试图阻止修改类本身,则可以创建一个元类来定义该类的__setattr__方法。

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
Run Code Online (Sandbox Code Playgroud)