用__getattr__和相关的封装

我试图封装一个对象而不更改其默认行为,问题是,当我可以访问它已经构造的对象时。因此,我的想法是使用继承和使用__getattr__,__setattr__,__getitem__,和__setitem__和代表对封装的对象,除了场我定义自己。


class Request(HttpRequest):


    def __init__(self, request, *args, **kwargs):

        self._original_request = request

        super(Request, self).__init__(*args, **kwargs)


    def __getattr__(self, name):

        return getattr(self._original_request, name)


    def __setattr__(self, name, value):

        if name == '_original_request':

            super(Request, self).__setattr__(name, value)

        else:

            self._original_request.__setattr__(name, value)


    def __getitem__(self, key):

        return self._original_request[key]


    def __setitem__(self, key, value):

        self._original_request[key] = value

如果我通过原始对象,一切都很好。如果不这样做,我会得到


host = self.META['SERVER_NAME']

KeyError: u'SERVER_NAME'

我想念什么吗?我的课程难道不应该完全像它所封装的那样吗?


狐的传说
浏览 141回答 2
2回答

肥皂起泡泡

问题出在行:    super(Request, self).__init__(*args, **kwargs)这将导致在您的实例上调用该类的__init__方法,这是没有意义的。因此,只需摆脱那条线。HttpRequestRequest另外,我不明白为什么首先要继承子类。由于python具有鸭子类型,并且您已经完全包装了内部对象,所以为什么不这样做:class Request(object):    def __init__(self, request, *args, **kwargs):        self._original_request = request    def __getattr__(self, name):        return getattr(self._original_request, name)    def __setattr__(self, name, value):        if name == '_original_request':            super(Request, self).__setattr__(name, value)        else:            self._original_request.__setattr__(name, value)    def __getitem__(self, key):        return self._original_request[key]    def __setitem__(self, key, value):        self._original_request[key] = value

牧羊人nacy

堆栈跟踪显示了问题所在:代码试图将属性设置为self._original_request而不是self.__dict__。阅读Python文档以定制属性访问。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python