gpt4 book ai didi

python - 在 Python 中使类不可变的方法

转载 作者:太空狗 更新时间:2023-10-29 16:57:31 26 4
gpt4 key购买 nike

我正在做一些分布式计算,其中几台机器在假设它们都具有不同类的相同版本的情况下进行通信。因此,使这些类不可变似乎是一个好的设计;并不是说它必须阻止有恶意的用户,只是足够不变以至于它永远不会被意外修改。

我该怎么做?例如,我将如何实现一个元类,使使用它的类在定义后不可变?

>>> class A(object):
... __metaclass__ = ImmutableMetaclass
>>> A.something = SomethingElse # Don't want this
>>> a = A()
>>> a.something = Whatever # obviously, this is still perfectly fine.

替代方法也很好,例如装饰器/函数接受一个类并返回一个不可变类。

最佳答案

如果使用 __slots__ 的老把戏不适合你,这个,或者它的一些变体可以做:只需写下 __setattr__你的元类的方法是你的守卫。在此示例中,我阻止分配新属性,但允许修改现有属性:

def immutable_meta(name, bases, dct):
class Meta(type):
def __init__(cls, name, bases, dct):
type.__setattr__(cls,"attr",set(dct.keys()))
type.__init__(cls, name, bases, dct)

def __setattr__(cls, attr, value):
if attr not in cls.attr:
raise AttributeError ("Cannot assign attributes to this class")
return type.__setattr__(cls, attr, value)
return Meta(name, bases, dct)


class A:
__metaclass__ = immutable_meta
b = "test"

a = A()
a.c = 10 # this works
A.c = 20 # raises valueError

关于python - 在 Python 中使类不可变的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com