Редактировать: добавлен пример кода для Python 3
Примечание: этот другой ответ выглядит так, как будто он обеспечивает гораздо более полную реализацию, подобную следующей (с дополнительными функциями).
Сначала создайте метакласс :
class MetaConst(type):
def __getattr__(cls, key):
return cls[key]
def __setattr__(cls, key, value):
raise TypeError
Это предотвращает изменение свойств статики. Затем создайте другой класс, который использует этот метакласс:
class Const(object):
__metaclass__ = MetaConst
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
raise TypeError
Или, если вы используете Python 3:
class Const(object, metaclass=MetaConst):
def __getattr__(self, name):
return self[name]
def __setattr__(self, name, value):
raise TypeError
Это должно предотвратить изменение реквизита экземпляра. Чтобы использовать его, наследуйте:
class MyConst(Const):
A = 1
B = 2
Теперь реквизит, доступ к которому напрямую или через экземпляр, должен быть постоянным:
MyConst.A
# 1
my_const = MyConst()
my_const.A
# 1
MyConst.A = 'changed'
# TypeError
my_const.A = 'changed'
# TypeError
Вот пример приведенного выше в действии. Вот другой пример для Python 3.