2010-08-26 3 views
3

У меня есть класс Python C, который должен иметь два псевдо-dict s a и b. Термин псевдо-дикты означает, что словари фактически не существуют и что они «пересчитываются» каждый раз при доступе к ключу.Pseudo-dicts as properties

В псевдокоде это будет выглядеть так:

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' 

Я мог бы реализовать класс для a и b, но так как есть только несколько коротких методов, интересно, есть ли более элегантный и компактный способ сделать это.

+4

Почему именно об этом сообществе? –

+0

Вопрос не был четко сформулирован, и я не был уверен, есть ли вообще ответ, поэтому я думал, что это не стоит никакой репутации. Более того, это позволяет другим (в лучшем случае носителям языка) легче прояснить мой вопрос. – 2010-08-26 11:40:21

+0

Немного любопытства. Зачем вам это нужно? Что такое сценарий? –

ответ

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'] 

Я не уверен, где значения для этих «псевдо-dicts» приходят из, так что вы должны обновить метод __getitem__.

+1

Значения из псевдоданных поступают из 'C', поэтому для этого подхода' PseudoDict' должен иметь доступ к «закрытым» переменным 'C'. – 2010-08-26 06:35:54

+1

@ott, я все еще не уверен, откуда берутся значения, но я обновил этот пример. – carl

+1

@ott, вы также можете передать функцию, которая будет использоваться для извлечения значения из 'C' в конструктор' PseudoDict', так что 'a' и' b' на самом деле способны предоставлять разные значения. –

1

Нравится?

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'] 
+0

Они не должны возвращать константы. Кроме того, они должны поддерживать несколько ключей. – 2010-08-29 09:43:45

+0

Не могли бы вы дать реальный пример использования и почему нужен псевдодикт? –