我正在编写一个带有自定义
__eq__
和 __hash__
方法的类,并且 __hash__
基本上返回类的属性之一(这是一个整数)。因此,我需要使这个属性尽可能不可变。有没有办法让Python中的属性不可变?
我当然可以做到
__private
,但这不完全是一回事。此时我也不确定是否应该将我的类设为数据类。
更多上下文(如果这在某种程度上相关):类
Simplex
表示一个组合单纯形,并存储一组顶点(以二进制数的形式)和一个整数系数。该类有一个方法 boundary()
,它应该返回 Complex
类型的对象,它是 Simplex
实例的集合。 __eq__
方法认为 A == B
如果它们的顶点集重合(系数不相关)。方法__hash__
返回二进制存储的顶点。我希望 __hash__
以这种特定方式工作,因为我认为这会简化 Complex
中相等单纯形的相加。
尝试使用自定义的 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