我可以在 Python 3 中创建不可变的类属性吗?

问题描述 投票:0回答:1

我正在编写一个带有自定义

__eq__
__hash__
方法的类,并且
__hash__
基本上返回类的属性之一(这是一个整数)。因此,我需要使这个属性尽可能不可变。有没有办法让Python中的属性不可变?

我当然可以做到

__private
,但这不完全是一回事。此时我也不确定是否应该将我的类设为数据类。

更多上下文(如果这在某种程度上相关):类

Simplex
表示一个组合单纯形,并存储一组顶点(以二进制数的形式)和一个整数系数。该类有一个方法
boundary()
,它应该返回
Complex
类型的对象,它是
Simplex
实例的集合。
__eq__
方法认为
A == B
如果它们的顶点集重合(系数不相关)。方法
__hash__
返回二进制存储的顶点。我希望
__hash__
以这种特定方式工作,因为我认为这会简化
Complex
中相等单纯形的相加。

python class attributes immutability
1个回答
0
投票

尝试使用自定义的 class_property 装饰器。

类似:


class ClassPropertyDescriptor(object):

    def __init__(self, fget, fset=None):
        self.fget = fget
        self.fset = fset

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        return self.fget.__get__(obj, klass)()

    def __set__(self, obj, value):
        if not self.fset:
            raise AttributeError("can't set attribute")
        type_ = type(obj)
        return self.fset.__get__(obj, type_)(value)

    def setter(self, func):
        if not isinstance(func, (classmethod, staticmethod)):
            func = classmethod(func)
        self.fset = func
        return self

def classproperty(func):
    if not isinstance(func, (classmethod, staticmethod)):
        func = classmethod(func)

    return ClassPropertyDescriptor(func)


class Bar(object):

    _bar = 1

    @classproperty
    def bar(cls):
        return cls._bar

© www.soinside.com 2019 - 2024. All rights reserved.