У меня есть какой-то модуль python
, который имеет класс ModuleClass
, и я не могу изменить этот класс.
Теперь я хочу иметь возможность проксировать методзвонки и добавить определенные функции ведения журнала.Я предполагаю, что это должно быть сделано через объект пересылки и соответствующий прокси (following Effective Java, Item 16)
.
Псевдокод python
, который я придумал, выглядит следующим образом.
(Извините, у меня действительно плохо получается python
, и я был бы признателен, если бы вы могли указать здесь ошибки).
# This is what I've got in my module and this code cannot be changed.
class ModuleClass(object):
def method1(self):
# Some implementation
pass()
def method2(self):
# Some implementation
pass()
# Simple forwarding proxy to avoid the situation described in Effective Java, I16
# However, in Java this class would usually be extending the interface, not
# inheriting 'ModuleClass' (I'm confused and don't know how to do the same
# in python).
class ForwardingModuleClass(ModuleClass):
# 'proxifiedObject' is
def __init__(self, proxifiedObject):
self.proxifiedObject = proxifiedObject
# Overriding the first method
def method1(self):
return self.proxifiedObject.method1()
# Same for method2...
class LoggingModuleClass(ForwardingModuleClass):
# 'classThatActuallyDoesStuff' should be an instance of 'ModuleClass'.
def __init__(self, classThatActuallyDoesStuff):
# Sorry for my bad knowledge of python syntax, but
# I assume I can initialize the superclass here using
# the supplied 'ModuleClass' instance.
super(classThatActuallyDoesStuff)
# Overriding the first method.
def method1(self):
print("Yay! This 'method1' really logs something!")
return super.method1()
# Overriding the second method.
def method2(self):
print("Yay!!!! This 'method2' also does something cool!")
return super.method2()
Теперь, я думаю, правильно написано, что это будет работать, и у меня будет прокси-сервер регистрации для моего начального ModuleClass
.
Если есть ошибки или если это не pythonish, пожалуйста, укажите это.
Кроме того, Я подозреваю, что это легко сделать с помощью decorators
, , но, к сожалению, я не могу придумать подходящий путь и понятия не имею, что может произойтиесли ModuleClass
уже имеет некоторые методы декораторов.
Не могли бы вы помочь мне и здесь?