【问题标题】:python getattr and setattr with self.__dict__python getattr 和 setattr 与 self.__dict__
【发布时间】:2014-04-05 09:26:15
【问题描述】:

我一直在阅读有关覆盖 getattr 和 setattr 的内容,如果我在构造函数中使用 self.__dict__ = self ,我无法确定是否需要覆盖分配。

一旦我创建了一个类的实例

a = OPT(foo='bar')

a.foo 和 a['foo'] 使用和不使用 __getattr__ 和 __setattr__ 声明。

如果我两者都需要,谁能解释一下。如果我这样做,为什么?谢谢!

class OPT(dict):
    __getattr__ = dict.__getitem__
    __setattr__ = dict.__setitem__

    def __init__(self, *args, **kwargs):
        super(OPT, self).__init__(*args, **kwargs)
        self.__dict__ = self

【问题讨论】:

  • 设置self.__dict__ = self 可能不是一个好主意。你想用这段代码完成什么?
  • 我以 obj 或 dict 的形式访问该类。所以我可以做 a['bar'] 或 a.bar。喜欢this post
  • 问题是如果有人做a['keys'] = 2,他们会踩到dict的keys()方法,等等。
  • 哈,我没想到。我以前见过这个实现。有很多关于它的帖子,但我不记得这个问题出现了。
  • @BrenBarn 的评论才是真正的答案。

标签: python


【解决方案1】:

当你想在类用户获取或设置属性时做一些额外的事情时,你会覆盖 getattr 和 setattr。例如:

1) 您可能会避免在用户操作无效属性时引发异常,因此您只需为未知属性返回 None。

2) 属性操作实际上是转发/委托的,因此事先不知道有效属性,例如表示数据库行的类,用户将列作为属性进行操作。我需要运行时检查给定的属性名称是否与列名称匹配,也许我想原谅大写/小写的差异等。

另外,包含有时比子类化更受欢迎。您可以创建一个包含 dict 的类,而不是从 dict 继承。

【讨论】:

  • 如果我不打算做类似的事情,我就不需要覆盖 getattr 和 setattr 了吗?在您的第一个示例中,我总是可以传入 .get() 的默认值。我不知道你的第二点的例子是什么。
  • 编辑了第二个例子以更清晰。
猜你喜欢
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多