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

2024-04-19

这可能看起来是一个非常基本的问题,但我在 SO 或其他地方找不到任何有用的东西......

如果您参加内置课程,例如int or list,没有办法为它们创建额外的类属性(这显然是一个理想的行为):

>>> 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__类属性是一种解决方案(除其他外),以​​禁止创建不需要的instance属性,但是禁止不需要的过程是什么class属性,如内置类中所做的那样?


我认为你应该玩元类 https://docs.python.org/3/reference/datamodel.html#metaclasses。它可以定义类的行为而不是其实例。

评论来自帕特里克·豪 https://stackoverflow.com/questions/59361832/how-to-forbid-creation-of-new-class-attributes-in-python/59412709?noredirect=1#comment105012599_59361832指的是另一个所以回答 https://stackoverflow.com/a/59376655/4373898使用以下代码片段:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何禁止在Python中创建新的类属性? 的相关文章

随机推荐