У меня есть модуль 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
.
Если есть ошибки или они написаны не на питонском языке, укажите на них.
Кроме того, Я подозреваю, что это можно легко сделать с помощью decorators
, но, к сожалению, я не могу найти подходящий способ и понятия не имею, что может случиться, если ModuleClass
уже имеет некоторые декораторы методов.
Не могли бы вы мне тоже помочь?
python
. - person Yippie-Ki-Yay   schedule 16.11.2011