Форум сайта python.su
857
FishHookБанда четырёх описывает паттерны через агрегацию
Имена, дружище, имена!
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 >>>
Офлайн
568
py.user.next
Я дико извиняюсь, но интерфейс словаря подразумевает набор соответствующих методов: get(), update(), items(), keys(), values(), это не считая итерации. Мне нахер не нужен словарь, по которому нельзя сделать for k, v in dct.items()
Офлайн
857
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)] >>>
Офлайн
568

Офлайн
221
py.user.next
Вы серьезно? Мне кажется что страницами ранее вы как то про другой подход говорили.
Офлайн
857
JOHN_16В этом топе только про две темы говорил: 1) как оптимизировать код без наследования через агрегацию; 2) что такое интерфейс и как он реализуется в питоне, когда его нет встроенного.
Мне кажется что страницами ранее вы как то про другой подход говорили.
Отредактировано py.user.next (Окт. 5, 2017 16:25:23)
Офлайн
221
py.user.next
ну вот сделайте без наследования, а мы посмотрим - то что Вы написали выше - извините, это даже не смешно.
Офлайн
568
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)
Офлайн
857
Поправил код свой
>>> 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А что будет если dict изменится? Все классы рухнут сразу.class DefaultDict(dict):
FishHookВсе нужные методы пишутся в одну строку.print(d.items()) print(d.keys())
Отредактировано py.user.next (Окт. 6, 2017 05:15:01)
Офлайн
568
py.user.next
Бл@@@дь, а твои не рухнут что ли?
Вообще, какой-то разговор тупой. Ты противоречишь сам себе. Твой DefaultDict не реализует интерфейс словаря. Кошечки и собачки во всех твоих абстрактных размышлениях реализуют интерфейс Animal, и таким образом в коде мы можем безболезненно менять кошечек на собачек. Но ты не можешь поменять dict на DefaultDict, потому что внезапно в конструкторе появился обязательный аргумент.
Офлайн