пара способов
ЦЕПОЧКА ВЫЗОВОВВ коде вы привели пример, как хотели бы использовать: 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 такой способ и используется (наряду с первым) — прячет сложные алгоритмы извлечения элементов, манипуляции с ними, отдавая назад только удобное АПИ с понятными названиями