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

如何在Python中的新类上正确重写__setattr__和__getattribute__?

章涵蓄
2023-03-14
问题内容

我想重写我的Python类__getattribute____setattr__方法。我的用例是通常的用例:我有一些要处理的特殊名称,并且我希望其他任何行为都具有默认行为。因为__getattribute__,似乎我可以通过提高请求默认行为AttributeError。但是,我怎样才能做到这一点__setattr__呢?这是一个简单的示例,使用不可变字段“A”,“ B”和“ C”实现一个类。

class ABCImmutable(SomeSuperclass):
    def __getattribute__(self, name):
        if name in ("A", "B", "C"):
            return "Immutable value of %s" % name
        else:
            # This should trigger the default behavior for any other
            # attribute name.
            raise AttributeError()

    def __setattr__(self, name, value):
        if name in ("A", "B", "C"):
            raise AttributeError("%s is an immutable attribute.")
        else:
            # How do I request the default behavior?
            ???

用什么代替问号?对于老式类,答案显然是self.__dict__[name] = value,但是文档表明这对于新型类是错误的。


问题答案:

它的

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

在Python 2中,或

super().__setattr__(name, value)

在Python 3中

另外,饲养AttributeError不是 你如何退回到默认行为__getattribute__。您可以使用

return super(ABCImmutable, self).__getattribute__(name)

在Python 2或

return super().__getattribute__(name)

在Python 3上。

筹集会AttributeError跳过默认处理并转到__getattr__,或者AttributeError如果没有则在调用代码中产生__getattr__

请参阅有关自定义属性访问的文档。



 类似资料:
  • 听起来有点愚蠢,但我需要我的方法的帮助,这很烦人。我试着在网上查找,因为是一个出错和“找不到Kid constructor#2”的程序,尽管它在那里,我甚至会做其他事情,但它不起作用。好吧,这太多了,下面是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数是关闭的,应该是字符串)是关闭的。如果我硬编码第三个值,它就会失控,说它找不到这个(上面)。那么我怎么才能得到日期并把它分开

  • 问题内容: 当我在Python中打开FIFO(命名管道)进行写入时,发生了非常奇怪的事情。考虑一下当我尝试打开FIFO以便在交互式解释器中进行写入时发生的情况: 以上行将阻塞,直到我打开另一个解释器并键入以下内容: 我不明白为什么我必须等待打开管道进行读取,但是让我们跳过它。上面的代码将阻塞,直到有可用的数据为止。但是,假设我回到第一个解释器窗口并输入: 预期的行为是,在第二个解释器上,对的调用将

  • 问题内容: 我想定义一个包含和方法的类,可以按如下方式调用该类: 为了不使用隔行扫描类,我的想法是覆盖和方法并检查给定名称是否将return重定向到。但是我遇到了无限递归的问题。示例代码如下: 正如在代码中尝试创建新属性一样,它调用,再次调用,依此类推。我怎么需要更改此代码,即,在这种情况下,一个新的属性的创建,持有的价值? 还是有更好的方法来处理“映射”到的呼叫? 总是有关于为什么的问题:我需要

  • 问题内容: 如果我导入的模块定义了属于同一个包的同名类,则由于父包的__init__.py,它将作为类而不是模块导入。有关详细信息,请在不同目录中查看不同的导入结果。在Python Shell或ipython Shell中,如果我这样做 MyModule始终作为Class导入,因此我无法重新加载它(reload()仅适用于模块)。跑 再次似乎不更新类定义。有人可以建议一种在python shell

  • 我有一个python 3脚本,它应该从.csv文件中获取一些数据并将其写入json文件。在我的处理过程中,编码是正确的,因此德语元音变音符ü,ä或度符号°就像它们一样(#编码=标题处的cp1252)。 但是当我通过json.dump()写判决时,编码就消失了… 如何使用正确的编码向json文件写入判决?

  • 本文向大家介绍python中如何写类,包括了python中如何写类的使用技巧和注意事项,需要的朋友参考一下 类的定义 Python中,定义类是通过class关键字,例如我们定义一个存储学生信息的类: class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承