Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2017 08:50:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

FishHook
Имена, дружище, имена!
Банда четырёх описывает паттерны через агрегацию
https://www.ozon.ru/context/detail/id/2457392/

FishHook
На базе питоньего dict нужно реализовать классы DefaultDict
  
>>> class DefaultDict:
...     
...     def __init__(self, dct, t):
...         self.dct = dct
...         self.t = t
...     
...     def __setitem__(self, k, v):
...         self.dct[k] = v
...     
...     def __getitem__(self, k):
...         if self.t is int:
...             return self.dct.get(k, 0)
...         elif self.t is str:
...             return self.dct.get(k, '')
... 
>>> d = DefaultDict({}, int)
>>> d['x'] = 1
>>> d['x']
1
>>> d['y']
0
>>>



Офлайн

#2 Окт. 5, 2017 08:55:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next
Я дико извиняюсь, но интерфейс словаря подразумевает набор соответствующих методов: get(), update(), items(), keys(), values(), это не считая итерации. Мне нахер не нужен словарь, по которому нельзя сделать for k, v in dct.items()




Офлайн

#3 Окт. 5, 2017 09:04:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

FishHook
по которому нельзя сделать for k, v in dct.items()
  
>>> class DefaultDict:
...     
...     def __init__(self, dct, t):
...         self.dct = dct
...         self.t = t
...     
...     def __setitem__(self, k, v):
...         self.dct[k] = v
...     
...     def __getitem__(self, k):
...         if self.t is int:
...             default = 0
...         elif self.t is str:
...             default = ''
...         if k not in self.dct:
...             self.dct[k] = default
...         return self.dct[k]
...     
...     def items(self):
...         return self.dct.items()
... 
>>> d = DefaultDict({}, int)
>>> d['x'] = 1
>>> d['x']
1
>>> d['y']
0
>>> 
>>> list(d.items())
[('x', 1), ('y', 0)]
>>> 



Офлайн

#4 Окт. 5, 2017 09:19:46

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Общие методы для группы классов



Офлайн

#5 Окт. 5, 2017 16:04:07

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next
Вы серьезно? Мне кажется что страницами ранее вы как то про другой подход говорили.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Окт. 5, 2017 16:24:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

JOHN_16
Мне кажется что страницами ранее вы как то про другой подход говорили.
В этом топе только про две темы говорил: 1) как оптимизировать код без наследования через агрегацию; 2) что такое интерфейс и как он реализуется в питоне, когда его нет встроенного.

Пусть FishHook реализует DefaultDict через наследование от dict. Сколько у него кода получится?



Отредактировано py.user.next (Окт. 5, 2017 16:25:23)

Офлайн

#7 Окт. 5, 2017 17:15:31

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next
ну вот сделайте без наследования, а мы посмотрим - то что Вы написали выше - извините, это даже не смешно.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Окт. 5, 2017 18:28:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next
Пусть FishHook реализует DefaultDict через наследование от dict
Да на здоровье

   
class DefaultDict(dict):
  
    def __init__(self, default=None):
        super().__init__()
        self.default = default if default is not None else lambda: None
  
    def __getitem__(self, item):
        if item not in self:
            self[item] = self.default()
        return super().__getitem__(item)
  
    def __repr__(self):
        return "DefaultDict: {}".format(super().__repr__())
  
d = DefaultDict(list)
d["a"].append("qwerty")
print(d)
print(d["b"])
print(d.items())
print(d.keys())
for k in d:
    print(k)



Офлайн

#9 Окт. 6, 2017 05:12:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

Поправил код свой

  
>>> class DefaultDict:
...     
...     def __init__(self, dct, default=lambda: None):
...         self.dct = dct
...         self.default = default()
...     
...     def __setitem__(self, k, v):
...         self.dct[k] = v
...     
...     def __getitem__(self, k):
...         if k not in self.dct:
...             self.dct[k] = self.default
...         return self.dct[k]
...     
...     def items(self):
...         return self.dct.items()
... 
>>> d = DefaultDict({}, int)
>>> d['x'] = 1
>>> d['x']
1
>>> d['y']
0
>>> list(d.items())
[('x', 1), ('y', 0)]
>>> 
Это получается, что я могу теперь любой словарь снаружи подавать в конструктор в любое время. Или даже не словарь, а свой собственный словароподобный объект.

FishHook
 class DefaultDict(dict):
А что будет если dict изменится? Все классы рухнут сразу.

FishHook
  
print(d.items())
print(d.keys())
Все нужные методы пишутся в одну строку.



Отредактировано py.user.next (Окт. 6, 2017 05:15:01)

Офлайн

#10 Окт. 6, 2017 06:24:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next

Бл@@@дь, а твои не рухнут что ли?


Вообще, какой-то разговор тупой. Ты противоречишь сам себе. Твой DefaultDict не реализует интерфейс словаря. Кошечки и собачки во всех твоих абстрактных размышлениях реализуют интерфейс Animal, и таким образом в коде мы можем безболезненно менять кошечек на собачек. Но ты не можешь поменять dict на DefaultDict, потому что внезапно в конструкторе появился обязательный аргумент.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version