1

假设我有一个类似以下的课程:

class Test:
    def __init__(self, some_data_source):
        self.a = 5
        self.b = some_data_source['c']

我想将此类的所有实例变量设为只读,并将按如下方式使用它:

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)

最初,我考虑使用 properties,但后来我意识到为了动态添加它们,我需要在定义类之后添加这些属性(例如Test.attribute = property(...))。这不起作用,因为我想在类中定义这些属性(特别是在 中__init__)。

我怎样才能使我的所有实例变量对一个类都是只读的?

4

1 回答 1

1

检查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
于 2018-09-24T15:51:38.823 回答