Удаление метода при наследовании в Python

Модератор: Модераторы разделов

Ответить
Enar
Сообщения: 300

Удаление метода при наследовании в Python

Сообщение Enar »

Здравствуйте. Что-то никак понять не могу. Мне нужен статический словарь.

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

class StaticDict(dict):
    def __init__(self)
        dictionary = dict.fromkeys(['a', 'b', 'c'])
        super().__init__(dictionary)

Вот как-то так, но при этом мне нужно заблокировать методы pop, popitem и update которые есть в dict, и что-то я никак не соображу как это сделать.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 850
Статус: Оператор вычислительных машин
ОС: Debian

Re: Удаление метода при наследовании в Python

Сообщение Janik »

Наверное, надо им присвоить nil или null.
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
Enar
Сообщения: 300

Re: Удаление метода при наследовании в Python

Сообщение Enar »

В смысле присвоить, это же методы, а не атрибуты, их можно переопределить заставив выдавать ошибку, но тогда я не знаю какая ошибка будет корректной. Просто я вроде читал про возможность не наследовать конкретный метод, правда может в другом языке.
Спасибо сказали:
Аватара пользователя
yars
Сообщения: 1144
Статус: Slacker!
ОС: Slackware64-current

Re: Удаление метода при наследовании в Python

Сообщение yars »

Просто переопределите для этого класса соответствующие методы. Я, конечно, не гуру в Python, могу ошибаться, но не вижу причин, которые мешали бы это сделать:

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

class MyMegaClass()
   def __init__(self):
      def pop(*kwargs):
         pass

      ...
Slackware64-current/Xfce 4.12/Acer TravelMate 5760
-------------
Registered Linux User #557010
Спасибо сказали:
Enar
Сообщения: 300

Re: Удаление метода при наследовании в Python

Сообщение Enar »

yars писал(а):
16.11.2015 00:03
Просто переопределите для этого класса соответствующие методы. Я, конечно, не гуру в Python, могу ошибаться, но не вижу причин, которые мешали бы это сделать:

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

class MyMegaClass()
   def __init__(self):
      def pop(*kwargs):
         pass

      ...

pass можно для домашнего использования, но не совсем корректно, Может кто знает какую ошибку правильно выдавать?
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: Удаление метода при наследовании в Python

Сообщение yoshakar »

Не знаю как в python, но вообще в ООП это неправильный подход в принципе. Ваш StaticDict не является разновидностью dict. Поэтому вместо наследования вам надо использовать аггрегацию. А если вам нужно где-то единообрзно использовать dict и StaticDict, то их нужно унаследовать от одного (не знаю как это называется в python) интерфейса: если интерфейс уже есть подходящий стандартный, и dict его реализует, то просто унаследовав его и в StaticDict; а если стандартного нет, то сделав его самому, унаследовав его в StaticDict, а для стандартного dict сделав wrapper (адаптор).
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Удаление метода при наследовании в Python

Сообщение serzh-z »

Enar писал(а):
15.11.2015 14:12
Вот как-то так, но при этом мне нужно заблокировать методы pop, popitem и update которые есть в dict, и что-то я никак не соображу как это сделать.
https://docs.python.org/3/reference/datamod...container-types
Спасибо сказали:
Enar
Сообщения: 300

Re: Удаление метода при наследовании в Python

Сообщение Enar »

yoshakar писал(а):
16.11.2015 12:23
Не знаю как в python, но вообще в ООП это неправильный подход в принципе. Ваш StaticDict не является разновидностью dict. Поэтому вместо наследования вам надо использовать аггрегацию. А если вам нужно где-то единообрзно использовать dict и StaticDict, то их нужно унаследовать от одного (не знаю как это называется в python) интерфейса: если интерфейс уже есть подходящий стандартный, и dict его реализует, то просто унаследовав его и в StaticDict; а если стандартного нет, то сделав его самому, унаследовав его в StaticDict, а для стандартного dict сделав wrapper (адаптор).


Ну может я не так понял. Вообще мой StaticDict это dict с конкретными ключами, и все методы dict кроме тех которые добавляют или удаляют ключи к нему применимы. Т.е. Если не наследовать их надо переписывать самому.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Удаление метода при наследовании в Python

Сообщение NickLion »

Посмотрите вот єтот ответ, вроде __getattr__ — то, что Вам нужно.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Удаление метода при наследовании в Python

Сообщение serzh-z »

Enar писал(а):
16.11.2015 14:02
Ну может я не так понял. Вообще мой StaticDict это dict с конкретными ключами, и все методы dict кроме тех которые добавляют или удаляют ключи к нему применимы. Т.е. Если не наследовать их надо переписывать самому.
В таком случае можно перегрузить ненужные методы и кидать исключение в них.
Спасибо сказали:
Enar
Сообщения: 300

Re: Удаление метода при наследовании в Python

Сообщение Enar »

NickLion писал(а):
16.11.2015 16:17
Посмотрите вот єтот ответ, вроде __getattr__ — то, что Вам нужно.

Спасибо, не совсем уверен, что именно __getattr__ но вроде как раз решение моей проблемы рассматривается.
Спасибо сказали:
Аватара пользователя
Tema
Сообщения: 143

Re: Удаление метода при наследовании в Python

Сообщение Tema »

Enar писал(а):
17.11.2015 01:09
NickLion писал(а):
16.11.2015 16:17
Посмотрите вот єтот ответ, вроде __getattr__ — то, что Вам нужно.

Спасибо, не совсем уверен, что именно __getattr__ но вроде как раз решение моей проблемы рассматривается.


Самый быстрый - добавить в __init__(): self.pop = None
Хотя конечно ошибка будет не сильно понятной при вызове метода, ну такое :)
Спасибо сказали:
Ответить