首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中实现类不可变的方法

在Python中实现类不可变的方法
EN

Stack Overflow用户
提问于 2011-02-15 04:16:37
回答 2查看 11K关注 0票数 18

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

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

代码语言:javascript
复制
>>> class A(object):
...     __metaclass__ = ImmutableMetaclass
>>> A.something = SomethingElse # Don't want this
>>> a = A()
>>> a.something = Whatever # obviously, this is still perfectly fine.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 09:39:09

如果使用__slots__的老把戏不适合您,这个或它的一些变体可以做到:只需编写元类的__setattr__方法作为您的守卫。在本例中,我禁止分配新属性,但允许修改现有属性:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2011-02-15 04:22:15

如果你不介意重用别人的作品:

http://packages.python.org/pysistence/

不变的持久化(在函数式中,不是写到桌面意义上)数据结构。

即使您不按原样使用它们,源代码也应该提供一些启发。例如,他们的expando类在它的构造函数中接受一个对象,并返回它的一个不可变的版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4996815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档