所以我有這樣的代碼:Python類無意單
# The Headers class is like a dictionary but is able to store multiple name-value pairs with the same name
class Headers:
def __init__(self, index = []):
self.index = index
def __contains__(self, name):
for own_name, value in self.index:
if name.lower() == own_name.lower():
return True
return False
def __getitem__(self, name):
for i in range(len(self.index)):
if name.lower() == self.index[i][0].lower():
return self.index[i][1]
def __iter__(self):
return HeadersIterator(self)
def __setitem__(self, name, value):
for i in range(len(self.index)):
if name.lower() == self.index[i][0].lower():
self.index[i][1] = value
def add(self, name, value):
self.index.append((name, value))
class HeadersIterator:
def __init__(self, headers, index = 0):
self.headers = headers
self.index = index
def __next__(self):
if self.index >= len(self.headers.index):
raise StopIteration()
result = self.headers.index[ self.index ]
self.index += 1
return result
我只是有這個問題吧,當我嘗試使用它,它似乎表現得好像它放在一個單例。下面是一些其他代碼,顯示我使用它:
def headers(self):
hs = Headers()
print("huh?", Headers, hs.index,)
# Most headers start with HTTP_
for name, value in self.environ.items():
if name.startswith('HTTP_'):
parts = [ (x[0].upper() + x[1:].lower()) for x in name[ len('HTTP_') : ].split('_') ]
hs.add('-'.join(parts), value)
# Some don't
if 'CONTENT_LENGTH' in self.environ:
hs.add('Content-Length', str(self.environ['CONTENT_LENGTH']))
return hs
現在看來,它第二次打印「嗯?」行,看起來hs變量指向相同的Headers對象,這意味着它只會繼續添加到它返回的相同Headers變量,下一次有更多的條目。 任何幫助,非常感謝!
不,列表總是相同的。 –
可能與此有關:'index = []):'。我知道使用默認列表會導致問題,因爲它們是可變的。 – Carcigenicate
@JacquesdeHooge:我不確定這會解決任何問題,因爲在這種情況下** [] [:]'的**參考將被複制** ... –