如何使 class 的所有实例变量只读?
How do I make all instance variables of a class readonly?
假设我有一个 class 如下所示:
class Test:
def __init__(self, some_data_source):
self.a = 5
self.b = some_data_source['c']
我想将此 class 的所有实例变量设为只读,并将按如下方式使用它:
data_source = {
'c': 'some data'
}
x = Test(data_source)
# Should be illegal i.e result in an exception
x.a = 5
x.b = None
# This should be legal
print(x.a)
最初,我考虑过 using properties,但后来我意识到,为了动态添加它们,我需要在定义 class 之后添加这些属性(例如 Test.attribute = property(...)
).这不起作用,因为我想在 class 中定义这些属性(特别是在 __init__
中)。
还有什么方法可以使 class 的所有实例变量只读?
检查 hasattr
变量是否存在,如果出现无法为该变量设置新值的错误,请检查 __setattr__
class Test:
def __init__(self, some_data_source):
self.a = 5
self.b = some_data_source['c']
def __setattr__(self, name, value):
if hasattr(self, name):
raise ValueError('cannot set %s to %s' %(value, name))
self.__dict__[name]=value
data_source = {
'c': 'some data'
}
x = Test(data_source)
x.b='raise' # this will raise error
假设我有一个 class 如下所示:
class Test:
def __init__(self, some_data_source):
self.a = 5
self.b = some_data_source['c']
我想将此 class 的所有实例变量设为只读,并将按如下方式使用它:
data_source = {
'c': 'some data'
}
x = Test(data_source)
# Should be illegal i.e result in an exception
x.a = 5
x.b = None
# This should be legal
print(x.a)
最初,我考虑过 using properties,但后来我意识到,为了动态添加它们,我需要在定义 class 之后添加这些属性(例如 Test.attribute = property(...)
).这不起作用,因为我想在 class 中定义这些属性(特别是在 __init__
中)。
还有什么方法可以使 class 的所有实例变量只读?
检查 hasattr
变量是否存在,如果出现无法为该变量设置新值的错误,请检查 __setattr__
class Test:
def __init__(self, some_data_source):
self.a = 5
self.b = some_data_source['c']
def __setattr__(self, name, value):
if hasattr(self, name):
raise ValueError('cannot set %s to %s' %(value, name))
self.__dict__[name]=value
data_source = {
'c': 'some data'
}
x = Test(data_source)
x.b='raise' # this will raise error