【问题标题】:Is it possible for a Python mixin to access a global variable?Python mixin 是否可以访问全局变量?
【发布时间】:2013-05-30 02:05:20
【问题描述】:

我有一个 mixin,它定义了 finalize_response() 方法,打算在另一个类中覆盖:

class APILoggingMixin(object):
    """
    Provides logging functionality by overriding finalize_response(). 
    Intended to be mixed in with any rest_framework.views.APIView
    """
    def finalize_response(self, request, response, *args, **kwargs):
        logger.info('Some message.')
        return super(APILoggingMixin, self).finalize_response(request, response, *args, **kwargs)

还有一个实现finalize_response() 方法的类。在同一个模块中,定义了logger 全局变量:

import logging
logger = logging.getLogger(__name__)

class CategoryDetail(APILoggingMixin, generics.RetrieveUpdateDestroyAPIView):
    """
    Retrieve, update or delete a Category.
    """
    model = Category
    serializer_class = CategorySerializer
    permission_classes = (permissions.IsAuthenticated,)

如何访问 mixin 中的logger 变量?

【问题讨论】:

  • 它们在同一个文件中吗?如果是这样,请从其中一种方法中执行logger.whatever ...如果不是,则执行from otherfile import logger,然后使用它....

标签: python django mixins


【解决方案1】:

意识到APILoggingMixin.finalize_response 需要self 这是一个CategoryDetail 实例,我们可以将记录器附加到CategoryDe​​tail

class CategoryDetail(...):
    logger = logger

class APILoggingMixin(object):
    def finalize_response(self, ...):
        self.logger.info('Some message.')

# Or through get_logger()
class CategoryDetail(...):
    def get_logger(self):
        return logger

class APILoggingMixin(object):
    def finalize_response(self, ...):
        self.get_logger().info('Some message.')

    def get_logger(self):
        raise NotImplementedError

# Or take advantage of the fact that `self.__module__` equals to `__name__` in the module of `CategoryDetail`
class APILoggingMixin(object):
    def finalize_response(self, ...):
        logger = logging.getLogger(self.__module__)
        logger.info('Some message.')

【讨论】:

  • 独立地,我实际上做了第一个。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多