2

我在这里发现了类似的问题,但我的问题有点不同......我在 MyUtil 类中有 log() 函数作为 staticmethod:

class MyUtil(object):

    @staticmethod
    def log(message, level):
    ...

但现在我必须知道这个静态方法是从哪个类/对象调用的?例如:

class Deployer(object):

    def deploy(self):
        ...
        MyUtil.log ("Starting deployment", "info")
        ...

是否可以从 MyUtil.log 函数中获取并记录这个“Deployer”类名?

(我知道这是非常不面向对象的,并且在编写良好的程序中可能永远不会有用,但无论如何......)

4

3 回答 3

2

您是否考虑编写类似实现的日志记录模块。像下面这样的东西

制作一个单独的 Logger 类。当您需要一个记录器对象时,调用 Logger.get_logger(your_class_name)。此方法要么创建一个新的记录器并将其返回,要么返回已为该特定记录器名称创建的记录器。然后使用这个记录器。

这样,您可以随时使用标准记录器更改您自己的记录器。开发人员将熟悉您使用的方法。

logger = Logger.get_logger(Deployer.__class__.__name__)
logger.info("Starting deployment")

这是一个非常简单的记录器实现。

"""
Sample logger implementation
"""
import datetime


class Logger:
    """
    Main logger class
    """
    _cached_loggers = dict()

    def __init__(self, logger_name):
        self.name = logger_name
        self._cached_loggers[logger_name] = self

    @classmethod
    def get_logger(cls, logger_name):
        """
        Return a new logger or already existed one
        """
        if logger_name in cls._cached_loggers:
            logger = cls._cached_loggers[logger_name]
        else:
            logger = Logger(logger_name)
        return logger

    def info(self, msg):
        """
        logging info logs
        """
        print u"{0} - {1} - {2}".format(self.name,
                                        datetime.datetime.now(),
                                        unicode(msg))
于 2012-09-28T10:28:07.650 回答
1

这不是最好的设计,日志记录是一个具有所有缺点的“单例”,但如果您愿意接受这一点,那么可以为您的问题提供一些语言支持。您可以通过检查堆栈来获取调用者:

import inspect

class MyUtil(object):
    @staticmethod
    def log(message, level):
        frame, module, line, function, context, index = inspect.stack()[1]
        self_name = frame.f_code.co_varnames[0]  # Name of the first argument (usually 'self')
        instance = frame.f_locals[self_name]
        class_name = instance.__class__.__name__
        print class_name

class Deployer(object):
    def deploy(self):
        MyUtil.log ("Starting deployment", "info")

Deployer().deploy()
于 2012-09-28T10:33:22.063 回答
0

如您所知,Python 中的所有内容都是 Object.. 所以,您实际上可以将Class Object作为参数传递给您的方法..

因此,您可以像这样更改方法定义:-

class MyUtil(object):

    @staticmethod
    def log(message, level, ClassName):

并将调用类的对象传递给此方法:-

class Deployer(object):

    def deploy(self):
        ...
        MyUtil.log ("Starting deployment", "info", Deployer)
于 2012-09-28T10:10:06.590 回答