python - 类型错误 : 'Logger' object is not callable

标签 python oop logging

我有工具,其中使用了一些具有继承性的类。

这是我的第一个基于 OOP 的大型工具,我对类初始化有点困惑。

下面有很多代码,使这个Q更加清晰。

短继承树:

- RDSmanager(object)
    - Options(RDSmanager)
    - AutoEnv(RDSmanager)
    - UnityXMLgenerator(RDSmanager)

确切的记录器类是:

class Logger(object):

    def __init__(self, rdsmanager_localpath):

        """Create Logger"""

        self.rdsmanager_localpath = rdsmanager_localpath

        if not os.path.isdir(os.path.join(self.rdsmanager_localpath, 'logs')):
            os.mkdir(os.path.join(self.rdsmanager_localpath, 'logs'))

    def logger(self, modname):

        self.logger = logging.getLogger(modname)

        formatter = logging.Formatter('%(asctime)s  - %(filename)s[LINE:%(lineno)d] - %(name)s.%(funcName)s() - %(message)s')

        self.logger.setLevel(logging.DEBUG)

        filehandler = logging.FileHandler(os.path.join(self.rdsmanager_localpath, 'logs', 'rdsmanager.log'))
        filehandler.setLevel(logging.DEBUG)
        filehandler.setFormatter(formatter)

        consolehandler = logging.StreamHandler()
        consolehandler.setLevel(logging.INFO)

        self.logger.addHandler(filehandler)
        self.logger.addHandler(consolehandler)

主脚本RDSmanager.py包含:

from lib.local.rds_services import Logger
...

class RDSmanager(object):
    ...

    # path to current RDSmanager directory
    # used toi determine where files (generated XML, logs etc) c to store in
    rdsmanager_localpath = os.path.dirname(os.path.abspath(__file__))

    # global logger object
    logger = Logger(rdsmanager_localpath)

接下来,我有两个选择 - -c-D在其他类(class):

class Options(RDSmanager):

    """Main "selector" for passed options.
       For each option - appropriate Class.method() will be imported, initialized and called."""

    def getopts(self):
        ...
        parser = argparse.ArgumentParser()
        subparsers = parser.add_subparsers()

        # Unity options
        parser_unity = subparsers.add_parser('unity', help='Unity application options')
        parser_unity.set_defaults(func=self.handler_unity)
        ...
            parser_unity.add_argument('-c',
                                  '--confgen',
                                  action='store_true',dest='unity_confgen',
        ...
            parser_unity.add_argument('-D',
                                  '--deployauto',
                                  action='store_true',
                                  dest='unity_autoenv_deploy',
        ...

    def handler_unity(self, options_list):

        ...   

        if options_list.unity_confgen:
            self.logger.logger.info('Running Unity XML files generator.')
            from lib.unity.xml_config_generator import UnityXMLgenerator
            confgen = UnityXMLgenerator()
            # generate application's config.xml
            confgen.config_xml_generator()
            # generate XML files for each module with TAG == 'CLOUD'
            # see lib.unity.unity_services.UnityServices() docstring for details
            confgen.modules_xmls_generator()
        ...

        if options_list.unity_autoenv_deploy:
            self.logger.logger.info('Running developers AutoEnvironment deploy.')
            from lib.unity.autoenv.developers_auto_env import AutoEnv
            auto = AutoEnv()
            auto.deploy()

接下来,每个类(class)运行logger初始化,即:

class UnityXMLgenerator(RDSmanager):

    def __init__(self):

        print(id(self.logger.logger))
        print(id(self.logger))

        # self.build_type = build_type

        # self.logger.logger(self.__class__.__name__)

        print('self.logger')
        print(self.logger)

        print('self.logger.logger')
        print(self.logger.logger)

        self.logger.logger(self.__class__.__name__)

        ...

class AutoEnv(RDSmanager):

    def __init__(self):

        # self.build_type = build_type

        self.logger.logger(self.__class__.__name__)

-c使用的选项(即 - 当 class UnityXMLgenerator(RDSmanager) 直接从 class Options(RDSmanager) 初始化时) - 一切正常:

> RDSmanager.py unity -c
RDSmanager started at 23, Sep 2015 at 14:38:57
Running Unity XML files generator.
39816128
52831184
self.logger
<lib.local.rds_services.Logger object at 0x032623D0>
self.logger.logger
<bound method Logger.logger of <lib.local.rds_services.Logger object at 0x032623D0>>
...

但是 - 问题出现了,当 class UnityXMLgenerator(RDSmanager)class AutoEnv(RDSmanager) 调用的方法:

def mkconfig(self):
    ...
    confgen = UnityXMLgenerator()
    ...

然后运行:

> RDSmanager.py unity -D
RDSmanager started at 23, Sep 2015 at 14:43:16
Running developers AutoEnvironment deploy.
Story NG-5859-developers-auto-env-build-config status checked - OK
39011216
52678608
self.logger
<lib.local.rds_services.Logger object at 0x0323CFD0>
self.logger.logger
<logging.Logger object at 0x02534390>
Traceback (most recent call last):
  File "D:\Dropbox\RDS\rdsmanager_NG-1\RDSmanager.py", line 258, in <module>
    rds.getopts()
  File "D:\Dropbox\RDS\rdsmanager_NG-1\RDSmanager.py", line 176, in getopts
    res.func(res)
  File "D:\Dropbox\RDS\rdsmanager_NG-1\RDSmanager.py", line 228, in handler_unity
    auto.deploy()
  File "D:\Dropbox\RDS\rdsmanager_NG-1\lib\unity\autoenv\developers_auto_env.py", line 95, in deploy
    self.mkconfig()
  File "D:\Dropbox\RDS\rdsmanager_NG-1\lib\unity\autoenv\developers_auto_env.py", line 70, in mkconfig
    confgen = UnityXMLgenerator()
  File "D:\Dropbox\RDS\rdsmanager_NG-1\lib\unity\xml_config_generator.py", line 32, in __init__
    self.logger.logger(self.__class__.__name__)
TypeError: 'Logger' object is not callable

问题是:

  1. 为什么我运行 confgen = UnityXMLgenerator()来自 class Options(RDSmanager) - 对象 self.logger.logger是“<bound method Logger.logger of <lib.local.rds_services.Logger object at 0x032623D0>> ” - 但它是“<logging.Logger object at 0x02534390> ” - 当它从 class RDSmanager(object) 初始化时的子类类(class)AutoEnv(RDSmanager)confgen = UnityXMLgenerator()
  2. <logging.Logger object at 0x02534390>”和“<bound method Logger.logger of <lib.local.rds_services.Logger object at 0x032623D0>>”究竟是什么意思?
  3. 我在这里做错了什么,我该如何找到解决这个问题的方法?

最佳答案

您有一个实例属性 logger 和一个名为 logger方法。你不能同时拥有:

def logger(self, modname):
    self.logger = logging.getLogger(modname)

该实例属性 logger 屏蔽了具有相同名称的方法。使用不同的名称。

关于python - 类型错误 : 'Logger' object is not callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738976/

相关文章:

c# - 有没有办法将 ScheduledTransferPeriod 设置为小于一分钟?

google-app-engine - 需要以编程方式访问 GAE 日志

php - 记录捕获和未捕获的异常?

python - Django 中的全日历

python - 我可以在构建后自动运行脚本吗?

c# - 如何限制一个类只能在另一个类中创建?

C++类设计问题

使用可配置文本编辑器的 Python raw_input() 替换

python - 如何使用 Python 选择一年中的所有星期日?

java - 无法在面向对象编程、数组中为函数赋值