Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单日志对象_Python_Logging_Decorator_Proxy Classes - Fatal编程技术网

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
,当这种情况发生时