这可能是一个非常基本的问题,但对于SO或其他地方,我找不到任何帮助...
如果采用内置类,例如int
或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__
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] 删除。
我来说两句