使类在Python中不可变的方法

发布于 2021-01-29 15:23:09

我正在做一些分布式计算,其中假设所有机器都具有相同版本的各种类,那么多台机器进行通信。因此,使这些类不可变似乎是一个很好的设计。并非一定要以不良意图挫败用户,只是要使其具有足够的不变性,以至于绝不会偶然修改它。

我将如何处理?例如,如何实现一个使定义后使用它的类不可变的元类?

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

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

关注者
0
被浏览
137
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果使用的旧技巧__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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看