1

我有一个 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,)

如何访问loggermixin 中的变量?

4

1 回答 1

2

意识到这APILoggingMixin.finalize_responseself一个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.')
于 2013-05-30T02:35:50.603 回答