当前位置: 首页 > 面试题库 >

如何在不破坏默认行为的情况下在Python中重写__getattr__?

柴良哲
2023-03-14
问题内容

我想重写__getattr__类上的方法以执行某些操作,但我不想破坏默认行为。

正确的方法是什么?


问题答案:

覆盖__getattr__应该没问题-__getattr__只能作为最后的选择,即,如果实例中没有与名称匹配的属性。例如,如果您访问foo.bar,则__getattr__仅当foo没有调用属性时才会被调用bar。如果该属性是您不想处理的属性,请引发AttributeError

class Foo(object):
    def __getattr__(self, name):
        if some_predicate(name):
            # ...
        else:
            # Default behaviour
            raise AttributeError

但是,与不同__getattr____getattribute__首先会被调用(仅适用于新样式类,即从对象继承的类)。在这种情况下,您可以保留默认行为,如下所示:

class Foo(object):
    def __getattribute__(self, name):
        if some_predicate(name):
            # ...
        else:
            # Default behaviour
            return object.__getattribute__(self, name)

有关更多信息,请参见Python文档。



 类似资料:
  • 我最近通过从源代码编译在CentOS机器上安装了Python 2.7.3。Python 2.7.3安装在/opt/python2.7上,当我安装它时,我只需更改/usr/bin/Python以指向新版本。这显然是错误的,因为当我这样做的时候,它打破了百胜。我会得到以下内容。 我更改了/usr/bin/python以指向python 2.6.6,但现在2.6.6是python的默认版本。你知道怎么解

  • 我已经创建了一个在视觉上类似于一张卡(游戏卡)的对象-一张顶部有图像的卡,下面有一些关于该卡的信息,包括文本和符号。页面上可以有许多卡片。 单击一张卡片会将用户带到一个新页面。这是通过使用href将所有卡片元素包装在一个div中完成的。每张卡都有一个带有一些选项的下拉菜单。最初的问题是,单击下拉菜单时,卡也会被单击。 我想在单击下拉菜单时阻止卡被单击。单击下拉菜单时,下拉菜单本身应正常运行。 hr

  • 为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了ClientHTTPPrequestinterceptor。。。 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate时。获取…我将始终获取空对象(即使我看到对象我的响应)。 要解决RestTe

  • 问题内容: 我有一个使用ui.router包进行URL路由的Angular应用程序。我想更改它,以便如果用户尝试导航到他们已经在的页面,则路由器会重新加载该状态,而不是什么也不做。对于每个http://angular- ui.github.io/ui-router/site/#/api/ui.router.state。$ state#go,$ state.go 确实 采用了一个重载参数来实现此目的

  • 本文向大家介绍Linux中在不破坏磁盘的情况下使用dd命令,包括了Linux中在不破坏磁盘的情况下使用dd命令的使用技巧和注意事项,需要的朋友参考一下 无论你试图从即将坏掉的存储驱动器抢救数据,将归档备份到远程存储,还是在别处对活动分区制作一份完美副本,都要知道如何安全可靠地复制驱动器和文件系统。幸好,有dd这款简单而强大的镜像复制工具,而且历史悠久。在这方面没有比它更出色的工具了。 dd命令的解

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本