Python 简单日志对象
我有一些Python 简单日志对象,python,logging,decorator,proxy-classes,Python,Logging,Decorator,Proxy Classes,我有一些python模块,它有一个类ModuleClass,我不能修改这个类 现在,我希望能够代理方法调用并添加某些日志功能。我假设这应该通过转发对象和相应的代理(遵循有效的Java,第16项)完成 我提出的python伪代码如下 (对不起,我对python非常不在行,如果您能在这里指出错误,我将不胜感激)。 # This is what I've got in my module and this code cannot be changed. class ModuleClass(object
python
模块,它有一个类ModuleClass
,我不能修改这个类
现在,我希望能够代理方法调用并添加某些日志功能。我假设这应该通过转发对象和相应的代理(遵循有效的Java,第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()
现在,我想,如果写得好,这会起作用,我的初始
ModuleClass
会有日志代理
如果有错误或这不是pythonish,请指出。
# 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()
另外,我怀疑这可以很容易地使用装饰器来完成,
,但是,不幸的是,我无法找到合适的方法,并且我不知道如果模块类
已经有了一些方法装饰器会发生什么
你能帮我一下吗?直接子类ModuleClass怎么样:
import logging
logger=logging.getLogger(__name__)
class LoggingModuleClass(ModuleClass):
def method1(self):
logger.info("Yay! This 'method1' really logs something!")
return super(LoggingModuleClass,self).method1()
def method2(self):
logger.info("Yay! This 'method2' also does something cool!")
return super(LoggingModuleClass,self).method2()
logging.basicConfig(level=logging.DEBUG)
(我添加了代码以显示Python方式的基本设置)。直接子类ModuleClass如何:
import logging
logger=logging.getLogger(__name__)
class LoggingModuleClass(ModuleClass):
def method1(self):
logger.info("Yay! This 'method1' really logs something!")
return super(LoggingModuleClass,self).method1()
def method2(self):
logger.info("Yay! This 'method2' also does something cool!")
return super(LoggingModuleClass,self).method2()
logging.basicConfig(level=logging.DEBUG)
(我添加了代码以显示Python方式的基本设置)。如果您真的想要一个包装器,那么只需编写它,不需要子类和中间类
class LoggingFoo(object):
def __init__(self, *args, **kwargs):
self.obj = Foo(*args, **kwargs)
def method1(self):
# ...
return self.obj.method1()
def method2(self):
# ...
return self.obj.method2()
如果您真的想要一个包装器,那么只需编写它,而不需要子类和中间类
class LoggingFoo(object):
def __init__(self, *args, **kwargs):
self.obj = Foo(*args, **kwargs)
def method1(self):
# ...
return self.obj.method1()
def method2(self):
# ...
return self.obj.method2()
如果你正在寻找一个装饰解决方案,那么你应该看看这篇文章的答案:
您表示希望避免“不需要的消息”(如果method1调用method2),那么我建议您选择Cat Plus提供的解决方案,否则我会选择operators。如果您正在寻找装饰解决方案,那么您应该看看这篇文章的答案:
您表示希望避免“不需要的消息”(在method1调用method2的情况下),然后我建议您选择Cat Plus提供的解决方案,否则我会选择运算符。在编写Python时忘记Java。这两个函数的语义甚至不接近。@CatPlusPlus好的,但我想在
python
中应该有一个很好的方法来解决这个问题。python错误:super不是一个对象,而是一个方法。要调用父构造函数,您必须调用super()。\uuuu init\uuuu(),要调用父方法,您应该调用super().method()(我假设您使用的是python 3…)在编写python时忘记Java。这两个函数的语义甚至不接近。@CatPlusPlus好的,但我想在python
中应该有一个很好的方法来解决这个问题。python错误:super不是一个对象,而是一个方法。要调用父构造函数,您必须调用super()。\uuu init\uuu(),要调用父方法,您应该调用super().method()(我假设您使用的是python 3…class LoggingModuleClass
,而不是def
。是的,这就是高效Java
所谈论的。有时,如果您调用方法2
,实现隐式调用方法1
,您将在日志中收到不需要的消息(至少在我的情况下,它们是不需要的)。这就是转发类的目的。不过,谢谢你,如果你知道装饰器的解决方案,也许你也可以在这里帮助我。@unutbu是的,我怀疑日志记录包可能会很好。但是(只是出于好奇),例如,如果我想以问题中描述的相同方式添加基准测试,是否可以使用decorators?类日志ModuleClass
,而不是def
。是的,这就是高效Java
所谈论的。有时,如果您调用方法2
,实现隐式调用方法1
,您将在日志中收到不需要的消息(至少在我的情况下,它们是不需要的)。这就是转发类的目的。不过,谢谢你,如果你知道装饰器的解决方案,也许你也可以在这里帮助我。@unutbu是的,我怀疑日志记录包可能会很好。但是(只是好奇),例如,如果我想以与问题中描述的相同的方式添加基准测试-是否可以使用decorator?因此,由于python语义,该类的任何实例都可以传递到需要ModuleClass
的函数中?python是否可能,具有的函数与协定类似,如传递类的实例应为“ModuleClass”
?还是这个java在我心里说话?@Yippie Kai Yay:Python使用duck类型,接口是隐式的(如果一个对象有一个方法X,它可以在需要方法X的任何地方使用)。您可以使用isinstance
来声明类型,但是泛型代码应该避免使用它。非常感谢。我是否正确认识到,这种代理方式不会破坏method1
,method2
的现有装饰(如果存在)?这会一直有效吗?或者除了isinstance
,还有一些极端情况,当这可能失败时?因此,由于python语义的原因,这个类的任何实例都可以传递到需要ModuleClass
的函数中?python是否有可能,具有的函数与协定类似,如传递类的实例应为“ModuleClass”
?还是这个java在我心里说话?@Yippie Kai Yay:Python使用duck类型,接口是隐式的(如果一个对象有一个方法X,它可以在需要方法X的任何地方使用)。您可以使用isinstance
来声明类型,但是泛型代码应该避免使用它。非常感谢。我是否正确认识到,这种代理方式不会破坏method1
,method2
的现有装饰(如果存在)?这会一直起作用吗?还是会有一些拐角处的情况,除了isinstance
,当这种情况发生时