Как создать декоратор метода класса, который возвращает любой метод для всех экземпляров этого класса?
В моей реализации это выглядит так:
class qwe ():
spis = []
def __init__ (self, name, x, y):
self.name = name
self.x = x
self.y = y
qwe.spis.append (self)
def forall (func):
def wrapper (*args, **kwargs):
for i in qwe.spis:
return func(i)
return wrapper
@forall
def pr(self):
print (self.name)
print (self.x)
print (self.y)
p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()
Но в данном случае метод "pr()" возвращает только значение 0-го экземпляра
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
после return функция завершает свой работу, поэтому у вас вызывается первый раз и функцию завершается.
Если убрать return то все заработает
class qwe ():
spis = []
def __init__ (self, name, x, y):
self.name = name
self.x = x
self.y = y
qwe.spis.append (self)
def forall (func):
def wrapper (*args, **kwargs):
for i in qwe.spis:
func(i)
return wrapper
@forall
def pr(self):
print (self.name)
print (self.x)
print (self.y)
p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()
А если результат важен то так
class qwe ():
spis = []
def __init__ (self, name, x, y):
self.name = name
self.x = x
self.y = y
qwe.spis.append (self)
def forall (func):
def wrapper (*args, **kwargs):
arr = []
for i in qwe.spis:
arr.append(func(i))
return arr
return wrapper
@forall
def pr(self):
print (self.name)
print (self.x)
print (self.y)
p_1 = qwe('san', 10, 20)
p_2 = qwe('serg', 30, 40)
p_3 = qwe('vova', 20, 60)
qwe.pr()
Автор решения: Stanislav Volodarskiy
→ Ссылка
В Питоне есть функция map, которая применяет первый аргумент (функцию) ко всем элементам списка. Обратите внимание как вызывается функция: f(v, *args, **kwargs). В Питоне такой вызов соответствует более привычному v.f(*args, **kwargs):
class qwe ():
_lst = []
def __init__ (self, name, x, y):
self.name = name
self.x = x
self.y = y
qwe._lst.append(self)
def forall(f):
return lambda *args, **kwargs: map(lambda v: f(v, *args, **kwargs), qwe._lst)
@forall
def apply(self, f):
return f(self)
@forall
def in_radius(self, radius):
return self.x ** 2 + self.y ** 2 <= radius ** 2
lst = [qwe('san', 10, 20), qwe('serg', 30, 40), qwe('vova', 20, 60)]
print(*qwe.apply(lambda v: f'{v.name}: ({v.x}, {v.y})'), sep='\n')
print(*qwe.in_radius(55))
san: (10, 20) serg: (30, 40) vova: (20, 60) True True False