Запретить изменение переменной класса вне классаPython

Программы на Python
Ответить
Anonymous
 Запретить изменение переменной класса вне класса

Сообщение Anonymous »

У меня есть следующий класс, в котором я определил пару переменных класса и вспомогательный метод класса, в котором я обновляю значения этих переменных класса на основе некоторого условия.

Код: Выделить всё

class Foo:
_UPDATED_AT: datetime = datetime.datetime(2000, 1, 1)
STATUS: bool = False

@classmethod
def bar(cls):
# updated the class variable from here only based on some condition
if some_cond:
cls.STATUS = True
cls.UPDATED_AT = datetime.datetime.now()

return cls.STATUS
Я хочу: 1) предотвратить обновление (т. е. установку) этих переменных класса непосредственно за пределами класса, 2) но иметь возможность обновлять переменную класса из метода класса, чтобы семантически что-то вело себя как переменная частного класса в C++.
Мне удалось достичь первого из двух требований, используя метакласс a, который по сути блокирует настройку атрибутов

Код: Выделить всё

class MyMeta(type):
def __setattr__(cls, key, value):
raise AttributeError(f"Can't set {cls}.{key}")
Однако, как и ожидалось, это также предотвращает обновления внутри класса. Я не уверен, возможно ли этого добиться с помощью чистого Python, но, по сути, мне нужно каким-то образом определить, происходит ли обновление внутри или снаружи класса.
Я знаю, что мы можем пометить переменные как частные в Python с помощью ведущего подчеркивания (у меня уже есть такое в моем классе), которое может сообщить потребителям вашего кода, что эти переменные предназначены для внутреннего использования и не должны использоваться непосредственно потребителем.
Это как-то достижимо?

Подробнее здесь: https://stackoverflow.com/questions/785 ... -the-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»