【问题标题】:Pseudo-dicts as properties伪字典作为属性
【发布时间】:2010-08-26 06:26:36
【问题描述】:

我有一个 Python 类 C,它应该有两个伪 dicts ab。术语伪字典意味着字典实际上并不存在,并且每次访问键时都会“重新计算”它们。

在伪代码中如下所示:

class C:
    def a.__getitem__(self, key):
        return 'a'
    def b.__getitem__(self, key):
        return 'b'

>>> c = C()
>>> c.a['foo']
'a'
>>> c.b['bar']
'b'

我可以为ab 实现一个类,但是由于两者都只有几个简短的方法,我想知道是否有更优雅和紧凑的方法来做到这一点。

【问题讨论】:

  • 这个问题没有准确表达,我不确定是否有答案,所以我认为它不值得任何声誉。此外,这使得其他人(最好是母语人士)可以更轻松地澄清我的问题。
  • 有点好奇。为什么你需要这个?场景是什么?

标签: python methods nested nested-class nested-attributes


【解决方案1】:

为什么不直接定义自己的类?

class PseudoDict(object):
    def __init__(self, c):
        self.c = c

    def __getitem__(self, key):
        return self.c.somethingmagical()

class C(object):
    def __init__(self):
        self.a = PseudoDict(self)
        self.b = PseudoDict(self)

c = C()
print c.a['foo']
print c.b['bar']

我不确定这些“伪字典”的值来自哪里,因此您必须更新 __getitem__ 方法。

【讨论】:

  • 伪字典的值来自C,因此这种方法将PseudoDict 需要访问C 的“私有”变量。
  • @ott,我仍然不确定这些值的来源,但我更新了示例。
  • @ott,您还可以将用于从C 检索值的函数传递给PseudoDict 构造函数,以便ab 实际上能够提供不同的值。
  • 如果 PseudoDict 使用 C 的“私有”变量(即紧密耦合),则在 C 范围内定义 PseudoDict 以反映紧密耦合可能更合适
  • 您可能希望使用对C 的弱引用,以避免引用循环。
【解决方案2】:

像这样?

from collections import defaultdict
class C:
    a = defaultdict(lambda:'a')
    b = defaultdict(lambda:'b')

c=C()
print c.a['foo']
print c.b['bar']

或者对于真正的计算函数可能像这样?

from collections import defaultdict

class C:
    def __init__(self):
        self.a = defaultdict(self.geta)
        self.b = defaultdict(self.getb)
    def geta(self):
        return 'a'
    def getb(self):
        return 'b'

c=C()
print c.a['foo']
print c.b['bar']

【讨论】:

  • 它们不应该返回常量。此外,它们应该支持多个键。
  • 你能举出真实的例子吗?为什么需要伪字典?
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多