سؤال

لدي فئة بيثون C والتي يجب أن تحتوي على اثنين من الزائفة-dictس a و b. مصطلح الأطراف الزائفة يعني أن القواميس غير موجودة فعليًا وأنها "يتم إعادة حسابها" في كل مرة يتم فيها الوصول إلى المفتاح.

في الكود الكاذب ، سيبدو هذا هكذا:

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, ، ولكن نظرًا لأن كلاهما لديهما طرق قليلة فقط ، أتساءل عما إذا كانت هناك طريقة أكثر أناقة ودمجًا للقيام بذلك.

هل كانت مفيدة؟

المحلول

لماذا لا تحدد فصلك فقط؟

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__ طريقة.

نصائح أخرى

مثله؟

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']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top