Я создаю класс Python, который использует цепочку атрибутов. Я пытаюсь выяснить, есть ли способ определить, когда вызывается последний атрибут цепочки, и выполнить некоторый код обработки в этой точке. После вызова последнего связанного атрибута я хотел бы обработать собранные данные. Я понимаю, что атрибут обработки может быть вызван явно в конце цепочки, но я хотел бы избежать этого, если это возможно.
Например:
o = ObjectInstance()
# Note that the attribute calling order is subjective
o('data').method_a('other data').method_c('other_data') #o.process() is called here automatically
--Обновление--
Я нашел обходной путь, специфичный для моей ситуации, хотя он не отвечает на основной вопрос.
В моем конкретном случае я намерен обрабатывать несколько цепочек отдельно с помощью одного экземпляра. Переопределив атрибут __call__
моего класса, я могу проверить, была ли обработана предыдущая цепочка, и отреагировать соответствующим образом. Я уже планировал иметь отдельный метод рендеринга — который также может обрабатывать предыдущую цепочку — после того, как все цепочки будут обработаны, поэтому он работает для моего конкретного сценария.
Класс будет выглядеть примерно так:
class Chainable:
current_chain_data = None
processed_chains = list()
def __call__(self, data):
if self.current_chain_data:
self.process()
#Some logic
self.current_chain_data = data
return self
def method_a(self, data):
#Some logic
self.current_chain_data = data
return self
def method_b(self, data):
#...
def process(self, data):
#do stuff
self.processed_chains.append(self.current_chain_data)
self.current_chain_data = None
def render(self):
if self.current_chain_data:
self.process()
for c in self.processed_chains:
output += c
return output
И использоваться как:
c = Chainable()
# do some chaining
c('data').method_a('other_data').method_c('other_data')
# previous chain is processed here, new chain started
c('additional_data').method_b('other_data') #...
# previous chain is processed here, output rendered
c.render()
c
перед вызовомc
? Ожидали ли ваши пользователи такое поведение? - person Marcin   schedule 20.03.2012