Найти - Пользователи
Полная версия: Общие методы для группы классов
Начало » Python для новичков » Общие методы для группы классов
1 2 3 4 5 6
py.user.next
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
>>>
FishHook
py.user.next
Я дико извиняюсь, но интерфейс словаря подразумевает набор соответствующих методов: get(), update(), items(), keys(), values(), это не считая итерации. Мне нахер не нужен словарь, по которому нельзя сделать for k, v in dct.items()


py.user.next
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)]
>>> 
FishHook
JOHN_16
py.user.next
Вы серьезно? Мне кажется что страницами ранее вы как то про другой подход говорили.
py.user.next
JOHN_16
Мне кажется что страницами ранее вы как то про другой подход говорили.
В этом топе только про две темы говорил: 1) как оптимизировать код без наследования через агрегацию; 2) что такое интерфейс и как он реализуется в питоне, когда его нет встроенного.

Пусть FishHook реализует DefaultDict через наследование от dict. Сколько у него кода получится?
JOHN_16
py.user.next
ну вот сделайте без наследования, а мы посмотрим - то что Вы написали выше - извините, это даже не смешно.
FishHook
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)
py.user.next
Поправил код свой
  
>>> 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())
Все нужные методы пишутся в одну строку.
FishHook
py.user.next

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


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

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB