Обеспечение выбранной неизменности в Python - PullRequest
0 голосов
/ 19 апреля 2020

Я бы хотел иметь возможность объявлять указанные c переменные и объекты неизменяемыми. (Проблема возникает, когда переменные экземпляра объекта, которые должны рассматриваться как неизменяемые, могут быть изменены.) Одна мысль состоит в том, чтобы использовать именованные кортежи.

from collections import namedtuple


C_tuple = namedtuple('C_tuple', 'a b c')
class C:

    def __init__(self, a, b, c):
        self.c_tuple = C_tuple(a=a, b=b, c=c)

    @property
    def a(self):
        return self.c_tuple.a

    @property
    def b(self):
        return self.c_tuple.b

    @property
    def c(self):
    return self.c_tuple.c

c = C(1, 2, 3)
print(c.a, c.b, c.c)   # ==> `1 2 3`

(я не смог найти способ объявить C_tuple в классе C. Даже с from __future__ import annotations я все еще получаю ошибку.)

Есть ли лучший подход?

Спасибо.

1 Ответ

0 голосов
/ 19 апреля 2020

Когда вы определяете класс, я думаю, что вы определяете переменную a, b, c, ссылающуюся на себя.

def __init__(self, a, b, c):
    self.c_tuple = C_tuple(a='a', b='b', c='c')

Кроме того, вы пропускаете отступ в строке номер 20.

@property
def c(self):
    return self.c_tuple.c

Пожалуйста, не стесняйтесь меня поправлять, так как именованные кортежи для меня совершенно новые топи c :)

...