Discuss / Python / 有一个问题

有一个问题

Topic source

LesLieM樂

#1 Created at ... [Delete] [Delete and Lock User]

我这样写(加了*args**kw)

    def __init__(self, capacity, *args, **kw):
        super().__init__(*args, **kw)
        self._capacity = capacity

为什么不可以像下面这样创建实例

m_od = LastUpdatedOrderedDict(2, [('a', 1), ('b', 2)])

会报错

Traceback (most recent call last):
  File "C:/Users/xyeg/Desktop/Pycharmproject/test/y.py", line 38, in <module>
    m_od = LastUpdatedOrderedDict(2, [('a', 1)])#[('a', 1), ('b', 2), ('c', 3)]
  File "C:/Users/xyeg/Desktop/Pycharmproject/test/y.py", line 11, in __init__
    super().__init__(*args, **kw)
  File "C:/Users/xyeg/Desktop/Pycharmproject/test/y.py", line 22, in __setitem__
    if len(self) - containkey >= self._capacity:
AttributeError: 'LastUpdatedOrderedDict' object has no attribute '_capacity'

LesLieM樂

#2 Created at ... [Delete] [Delete and Lock User]

这个问题困扰了两天,突然想明白了,哈哈!

传入*args或**kw 内部会先逐个(k,v)依次调用__setitem__(),而这时"self._capacity = capacity" 还未执行,
因此会报错AttributeError: 'LastUpdatedOrderedDict' object has no attribute '_capacity'
把"self._capacity = capacity"放在"super().__init__(*args, **kw)"前面就对了

  • 1

Reply