Я пишу класс Python для обертывания/украшения/улучшения другого класса из пакета с именем petl, рамки для рабочих процессов ETL (перемещения данных). Из-за конструктивных ограничений я не могу просто подклассифицировать его; каждый вызов метода должен быть отправлен через мой собственный класс, чтобы я мог контролировать, какие объекты передаются обратно. Так что в принципе это прокси-класс, но у меня возникают проблемы с использованием существующих ответов/рецептов. Это то, что мой код выглядит следующим образом:Класс прокси не может вызывать методы для дочернего
from functools import partial
class PetlTable(object):
"""not really how we construct petl tables, but for illustrative purposes"""
def hello(name):
print('Hello, {}!'.format(name)
class DatumTable(object):
def __init__(self, petl_tbl):
self.petl_tbl = petl_tbl
def __getattr__(self, name):
"""this returns a partial referencing the child method"""
petl_attr = getattr(self.petl_tbl, name, None)
if petl_attr and callable(petl_attr):
return partial(self.call_petl_method, func=petl_attr)
raise NotImplementedError('Not implemented')
def call_petl_method(self, func, *args, **kwargs):
func(*args, **kwargs)
Затем я пытаюсь создать экземпляр таблицы и вызвать что-то:
# create a petl table
pt = PetlTable()
# wrap it with our own class
dt = DatumTable(pt)
# try to run the petl method
dt.hello('world')
Это дает TypeError: call_petl_method() got multiple values for argument 'func'
.
Это происходит только с позиционными аргументами; kwargs кажутся прекрасными. Я почти уверен, что это связано с тем, что self
не передается, но я не уверен, что это за решение. Может ли кто-нибудь подумать о том, что я делаю неправильно, или о лучшем решении?
Было бы полезно, чтобы точно знать, что 'petl' это, а также то, что' petl.fromcsv («test.csv») 'возвращает-ни определяется в коде, показанном в вашем вопросе. – martineau
есть [этот] (http://stackoverflow.com/questions/9942536/how-to-fake-proxy-a-class-in-python) вопрос, который содержит ссылку на рецепт activestate. Может быть полезной альтернативой. –
@martineau Спасибо за отзыв. Я обновил вопрос с дополнительной информацией о том, что такое библиотека и что она возвращает, однако я просто хотел указать, что это не совсем специфично для 'petl'. Это просто переход к другому классу, который может быть чем угодно. – Rob