@niriter
User

Как выполнить несколько методов одним разом python?

Как можно выполнить несколько методов класса - одной линией кода?
Например:
class hi():
    def hello(self):
        return str("Hello")

    def world(self, hello_str):
        tmp = hello_str + "World!"
        return tmp

caller = hi()
print(caller.hello().world())
  • Вопрос задан
  • 4909 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
пара способов

ЦЕПОЧКА ВЫЗОВОВ
В коде вы привели пример, как хотели бы использовать: caller.hello().world()

Если хотите, чтобы последний метод возвращал результат, то можно так:
class Hello(object):
    def __init__(self):
         self.msg = 'Hello'

    def hello(self, world):
        self.msg = self.msg + ', ' + world
        return self

    def print(self):
        return self.msg

caller = Hello()
msg = caller.hello('niriter').print()
print(msg) # Hello, niriter

Такого рода код используется в разного рода билдерах, когда нужно настроить обьект разным способом по разным условиям (разного рода билдеры, в ОРМ запрос собрать и прочее)

В вашей библиотеке по работе с html такой способ и используется (наряду со вторым) — вызываете разного рода методы, а возвращает все тот же обьект с разным состоянием и вы всегда можете вызвать новый метод (удалить элемент, добавить, все стереть) и по итогу вызвать получение своего нужного HTML

ИНКАПСУЛЯЦИЯ

class Hello(object):
    def __init__(self, msg='Friend'):
         self.msg = msg

    def print(self):
        init_msg = self.hello()
        return init_msg + ',  ' + self.msg
    
    def hello(self): # этот метод вызываем изнутри другого метода
        return str("Hello")

caller1 = Hello()
print(caller1.print()) # Hello, Friend

caller2 = Hello('Maks')
print(caller2.print()) # Hello, Maks


Инкапсуляция из мира ООП, наружу предоставляет некий метод, и вызвав его — выполнится некоторое поведение и изменение состояния. Нужна для сокрытия всех деталей и нюансов и оставляет только удобное АПИ для работы.

В вашей библиотеке по работе с html такой способ и используется (наряду с первым) — прячет сложные алгоритмы извлечения элементов, манипуляции с ними, отдавая назад только удобное АПИ с понятными названиями
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@asd111
Это называется chaining. Делается с помощью паттерна builder. Суть в том что каждая такая функция возвращает копию объекта который её вызвал(или указатель на него).
class Person: 
   def setName(self, name):
      self.name = name
      return self   ## this is what makes this work

   def setAge(self, age):
      self.age = age;
      return self;

   def setSSN(self, ssn):
      self.ssn = ssn
      return self


p = Person()
p.setName("Hunter")
 .setAge(24)
 .setSSN("111-22-3333")
Ответ написан
@vkulik79
модуль threading смотри
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы