Запретить (или работать с) изменением атрибута класса, доступ к которому осуществляется из геттера, в обход сеттера в PyPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Запретить (или работать с) изменением атрибута класса, доступ к которому осуществляется из геттера, в обход сеттера в Py

Сообщение Anonymous »


Я пытаюсь создать класс Python, и одним из атрибутов является словарь словарей. Я создаю его с использованием геттеров и сеттеров, потому что необходимо выполнить определенные проверки, чтобы убедиться в правильности типов данных и т. д. Предполагаемое использование — использовать функцию для добавления записей, чтобы она могла пройти проверки, но что Я обнаружил, что вы можете напрямую получить доступ к атрибуту словаря и добавить к нему ключ, минуя тем самым встроенные проверки функции.

Мой вопрос:
[*]Есть ли способ предотвратить поведение Object.dict_attribute[key] = some_dictionary, которое обходит проверки и предполагаемую функцию Object.add_item(some_dictionary)?< /ли> Если нет, есть ли способ вызвать функцию Object.add_item(some_dictionary) при вызове Object.dict_attribute[key] = some_dictionary, возможно, с использованием магических методов ?
Ниже я создал игрушечный пример, который должен воспроизводить описанное мной поведение. Это было запущено и протестировано с помощью Python 3.10.2.

# В книжном шкафу можно хранить книги, но их общее количество должно быть # при определенном весе на полку. класс Книжный шкаф: def __init__(self, num_shelves: int = 1, вес_предела: float = 50,0, книги: dict = нет) -> «Книжный шкаф»: # Создаем наши полки. self.shelves = число_полок self.weight_limit = предел_веса # Добавьте книги, если они определены. если книги не Нет: self.books = книги ### ЧАСТНЫЕ ФУНКЦИИ ### # Убедитесь, что книга четко определена. def _check_book(book: dict) -> bool: return((type(book) == dict и len(set(book.keys()).intersection(set(["вес", "полка"]))) == 2)) # Если книга хорошая, попробуйте добавить ее на полку. def _add_book_to_shelf(self, book: dict) -> Нет: # Проверьте определенные ключи. если не Bookcase._check_book(книга): поднять Exception("Каждая книга должна иметь целевую полку и вес.") цель = книга['полка'] # Если все в порядке, поместите его на полку, следя за тем, чтобы не превысить вес. если self._shelves[target]['weight'] + book['weight'] dict: возврат (self._shelves) # Инициализируем пустые полки. На этих полках будут храниться ключи от книг и общий вес. @shelves.setter def полки(self, num_shelves: int) -> Нет: self._shelves = {} if type(num_shelves) != int: поднять исключение("Полки должны быть целыми числами.") для меня в диапазоне (num_shelves): self._shelves = {"books": [], "weight": 0} возвращаться() @свойство def Weight_limit (self) -> dict: возврат (self._limit) @weight_limit.setter def Weight_limit(self, limit: int) -> Нет: self._limit = предел возвращаться() @свойство def book(self) -> dict: ret_list: список = [] для ключа в self._shelves: ret_list += self._shelves возврат (рет_список) # Книги - это список словарей с ключами "имя", "полка", "вес". @books.setter def book(self, book: list[dict]) -> Нет: # Опустошите полки и избавьтесь от уже имеющихся книг. self.shelves = len(self.shelves.keys()) # Каждая книга должна содержать имя (ключ), целевую полку и вес. для книги в книгах: self._add_book_to_shelf(книга) возвращаться() ##### ЗДЕСЬ ОШИБКА ##### # Пользователь должен использовать эту функцию, чтобы добавить книгу на полку. # Нам нужно пройти через эту функцию, чтобы проверки были выполнены. def add_book(self, book: dict) -> Нет: self._add_book_to_shelf(книга) возвращаться() если __name__ == "__main__": # Инициализируем список книг. книги = [ {'name': 'Голодная гусеница', 'полка': 0, 'вес': 0,5}, {'name': 'Убить пересмешника', 'shelf': 0, 'weight': 1.0}, {'имя': '1984', 'полка': 1, 'вес': 1,0} ] # Сделайте книжный шкаф из наших стартовых книг. библиотека = Книжный шкаф(число_полок = 2, предел веса = 20, книги = книги) # Давайте определим большую книгу. big_book = {'name': 'Полное собрание сочинений Толкина', 'полка': 1, 'вес': 200} # Добавьте еще одну книгу. Это должно потерпеть неудачу. ### ### РАСККОММЕНТАРИЙ ДЛЯ ОШИБКИ ### #library.add_book(big_book) # -> Приводит к соответствующей ошибке. # Давайте обойдем эту глупую функцию, почему бы и нет? библиотека.полки[1]['книги'].append(big_book) # Давайте сейчас проверим наши полки. для полки в библиотеке.shelves.keys(): print(полка, библиотека.полки[полка]) # Это сработало, но мы этого не хотим! Вот еще один взгляд на проблему. # Это вызывает метод получения, который возвращает атрибут. # | Это получает ключ «книги» возвращаемого значения. # | | Зачем тогда это сохраняет в памяти # | | если к нему обращался геттер? # | | | # В В В библиотека.полки[1]['книги'].append(big_book) Спасибо за любую помощь!
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • "Попробуйте исправить имя с именем существующего геттера или определение геттера или поля с именем"
    Anonymous » » в форуме Android
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Пропуск одного сеттера/геттера в Ломбоке
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Свойства против общего сеттера/геттера и дескриптора
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Свойства против общего сеттера/геттера и дескриптора
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Свойства против общего сеттера/геттера и дескриптора
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

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