为了账号安全,请及时绑定邮箱和手机立即绑定

用__getattr__和相关的封装

用__getattr__和相关的封装

狐的传说 2021-03-03 17:14:48
我试图封装一个对象而不更改其默认行为,问题是,当我可以访问它已经构造的对象时。因此,我的想法是使用继承和使用__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'我想念什么吗?我的课程难道不应该完全像它所封装的那样吗?
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

问题出在行:


    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


查看完整回答
反对 回复 2021-03-31
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

堆栈跟踪显示了问题所在:代码试图将属性设置为self._original_request而不是self.__dict__

阅读Python文档以定制属性访问。


查看完整回答
反对 回复 2021-03-31
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号