Решение ActiveState , на которое ссылается Pynt, делает экземпляры ROClass доступными только для чтения. Похоже, ваш вопрос состоит в том, может ли сам класс иметь атрибуты только для чтения.
Вот один из способов, основанный на комментарии Раймона Хеттингера :
#!/usr/bin/env python
def readonly(value):
return property(lambda self: value)
class ROType(type):
CLASS_PROPERTY = readonly(1)
class Foo(object):
__metaclass__=ROType
print(Foo.CLASS_PROPERTY)
# 1
Foo.CLASS_PROPERTY=2
# AttributeError: can't set attribute
Идея такова: рассмотрим первое решение Раймона Хеттингера:
class Bar(object):
CLASS_PROPERTY = property(lambda self: 1)
bar=Bar()
bar.CLASS_PROPERTY=2
Показывает относительно простой способ присвоить bar свойство только для чтения.
Обратите внимание, что вы должны добавить CLASS_PROPERTY = property(lambda self: 1)
строка определения класса бара, а не самого бара.
Итак, если вы хотите, чтобы класс Foo
имел свойство только для чтения, тогда родительский класс Foo
должен иметь значение CLASS_PROPERTY = property(lambda self: 1)
.
Родительским классом класса является метакласс. Следовательно, мы определяем ROType как метакласс:
class ROType(type):
CLASS_PROPERTY = readonly(1)
Затем мы делаем родительский класс Foo ROType:
class Foo(object):
__metaclass__=ROType