Python类无意的单例

2024-03-28 11:33:17 发布

您现在位置: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

现在看来,第二次打印“huh?”行时,hs变量似乎指向同一个Headers对象,这意味着它只会继续添加到同一个Headers变量中,而下一次返回的Headers变量中有更多的条目。 非常感谢您的帮助


Tags: nameinselfforindexlenreturnif
1条回答
网友
1楼 · 发布于 2024-03-28 11:33:17

Header本身不是一个单子,但它们都是指相同的index。这是由于建造商:

def __init__( self, index = []):
    # ...

这意味着Python构造一个列表,对于没有给定index的每个构造函数调用,都给出了对同一列表的引用

您可以通过传递一个不可变的(例如None),然后使用if语句并构造一个新列表来解决它,如下所示:

def __init__( self, index = None):
    if index is None:index = []
    # ...

尽管在某些情况下,将全局引用传递给构造函数是非常有用的(就像您在这里所做的那样),但还是建议谨慎地使用可变对象作为默认值:始终考虑传递不可变的(如42None'foobar'True()、…)

相关问题 更多 >