2

ここで同様の質問を見つけましたが、私の質問は少し異なります... MyUtilクラスのstaticmethodとしてlog()関数があります。

class MyUtil(object):

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

しかし今、私はこの静的メソッドがどのクラス/オブジェクトから呼び出されたかを知る必要がありますか?例えば:

class Deployer(object):

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

MyUtil.log関数からこの「Deployer」クラス名を取得してログに記録することは可能ですか?

(これは非常に非OOであり、適切に作成されたプログラムではおそらく役に立たないことを私は知っていますが、とにかく...)

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のすべてがオブジェクトであることをご存知のとおりです。したがって、実際には、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 に答える