class Parent:
known_children = [] # список классов-потомков Parent
@staticmethod
def register(klass): # декоратор для регистрации классов-потомков
Parent.known_children.append(klass)
return klass
@classmethod
def can_handle(cls, data): # "эй, потомок, ты можешь себя создать из этих данных?"
raise NotImplementedError()
@staticmethod
def make(data): # создаёт экземпляр одного из потомков
for child in Parent.known_children:
if child.can_handle(data): # потомок согласился обработать данные?
return child(data) # вызываем конструктор класса-потомка
else: # относится к for ... in !
raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
# тут остальная начинка класса
...
# а это пример потомка
@Parent.register # явная регистрация потомка через декоратор
# так удобнее, потому что так можно создавать промежуточных потомков,
# которые не будут реально использоваться - только в наследовании
class SomeChild(Parent):
@classmethod
def can_handle(cls, data):
return data.get('name', None) == 'SomeChild' # критерий для определения - наш случай или нет?
def __init__(self, data):
self.x = data['x']
self.y = data['y']
c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69}) # создаст экземпляр SomeChild
print(c)
try:
Parent.make({'name': 'invalid'}) # потерпит неудачу
except TypeError as err:
print(err)
foo = dict()
min_amount = 1
for type_, amount in (('food', 4), ('food', 3), ('car', 3), ('dog', 1)):
foo[type_] = foo.get(type_, 0) + (amount if amount >= min_amount else 0)
print(*sorted(foo.items(), key=lambda x: x[1]), sep='\n')
const asyncRequst = async (url) => {
const request = await fetch(url)
return resultBody = await request.json()
}
const fillTweetBlock = async () => {
try{
const result = await asyncRequst('/tweets')
console.log(result)
const listedItems = //ТУТ нужно обработать json в объекте result и получить ваш список.
const finalTweetStr = listedItems.reduce((acc, element, index) => {
console.log(index)
console.log(element)
return acc + `<div class='mb-4'><h1>${element.id}</h1><p>${element.content}</p></div>\n`
}, '')
tweetsElement.innerHTML = finalTweetStr;
}
catch(e){
console.log('Error occured: ', e)
}
}
fillTweetBlock()